• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-161  評(píng)論-223  文章-30  trackbacks-0
               原題為某著名軟件公司的試題,大意如下:給定一個(gè)容器,要求刪除容器中重復(fù)的元素,并保持剩余元素的順序不變。在這里,本文為了全面通用考慮,作了擴(kuò)展,刪除vector中的重復(fù)元素,從容器中元素順序上可分為2種情形:1)保持剩余元素順序不變,特稱為穩(wěn)定刪除,對(duì)應(yīng)下面的stable_unique版本函數(shù)模板 2)不考慮順序變化,特稱為快速刪除。對(duì)應(yīng)下面的quick_unique版本函數(shù)模板。從重復(fù)的概念定義也可分為2種情況:1)基于簡(jiǎn)單的相等判斷 2)基于謂詞的等價(jià)判斷。因此,由排列組合得知應(yīng)該有4種版本的實(shí)現(xiàn),下面給出代碼描述
             1//函數(shù)對(duì)象模板類
             2template<typename T>
             3struct Predicate
             4{
             5    Predicate()
             6    {
             7    }
             8
             9    Predicate(const T& t)
            10        :_t(t)
            11    {
            12    }
            13    bool operator()(const T& t) const
            14    {
            15        //可以自定義比較實(shí)現(xiàn)
            16        return _t == t;
            17    }
            18    //支持std::unique謂詞版本的刪除
            19    bool operator()(const T& l,const T& r) const
            20    {
            21        //可以自定義比較實(shí)現(xiàn)
            22        return l == r;
            23    }

            24    T _t;
            25}
            ;
            26
            27//quick_unique版本1: 相等判斷
            28template<typename T>
            29void quick_unique(std::vector<T>& con)
            30{
            31    std::sort(con.begin(),con.end());
            32    con.erase(std::unique(con.begin(),con.end()),con.end());
            33}

            34
            35//quick_unique版本2: 謂詞判斷
            36template<typename T,template <typename U> class Predicate>
            37void quick_unique(std::vector<T>& con)
            38{
            39    std::sort(con.begin(),con.end());
            40    con.erase(std::unique(con.begin(),con.end(),Predicate<T>()),con.end());
            41}
            42
            43//stable_unique版本1: 相等判斷
            44template<typename T>
            45void stable_unique(std::vector<T>& con)
            46{
            47    std::vector<T>::iterator it,ret,beg = con.begin();
            48    for (it = ++con.begin();it!=con.end();)
            49    {
            50        ret = find(beg,it,*it);
            51        if (ret != it)
            52            it = con.erase(it);
            53        else
            54            ++it;
            55    }
            56}
            57
            58//stable_unique版本2: 謂詞判斷
            59template<typename T,template <typename U> class Predicate>
            60void stable_unique(std::vector<T>& con)
            61{
            62    std::vector<T>::iterator it,ret,beg = con.begin();
            63    for (it = ++con.begin();it!=con.end();)
            64    {
            65        ret = find_if(beg,it,Predicate<T>(*it));
            66        if (ret != it)
            67            it = con.erase(it);
            68        else
            69            ++it;
            70    }
            71}
               以上代碼在vc2005環(huán)境下編譯測(cè)試通過(guò),再進(jìn)一步擴(kuò)展,問(wèn)題完全可以歸類為刪除某容器內(nèi)重復(fù)元素,只要再加一個(gè)模板的模板參數(shù)即可template <typename T> class Conn;函數(shù)的形參類型變?yōu)閟td::Conn<T>就行了,但要注意的是不同平臺(tái)下對(duì)應(yīng)容器的erase實(shí)現(xiàn)所返回的迭代器可能有所差別,比如map要這樣寫(xiě)才能在linux上正確工作:conn.erase(it++)。對(duì)于特殊的情況,可對(duì)以上4個(gè)函數(shù)作對(duì)應(yīng)的重載(注意,函數(shù)模板沒(méi)有特化的概念)來(lái)解決。
            posted on 2011-06-25 14:49 春秋十二月 閱讀(6565) 評(píng)論(3)  編輯 收藏 引用 所屬分類: Opensrc

            評(píng)論:
            # re: 刪除vector容器內(nèi)的重復(fù)元素[未登錄](méi) 2011-06-29 16:15 | tom
            - construct a set S
            - for each element in vector
            insert it into S
            if fails, remove element  回復(fù)  更多評(píng)論
              
            # re: 刪除vector容器內(nèi)的重復(fù)元素 2011-06-30 11:37 | w2j3
            @tom

            并保持剩余元素的順序不變
              回復(fù)  更多評(píng)論
              
            # re: 刪除vector容器內(nèi)的重復(fù)元素 2011-06-30 11:43 | w2j3
            @tom

            sorry you were right in saying that

            please ignore my last comment, thanks.  回復(fù)  更多評(píng)論
              
            国内精品久久久久影院一蜜桃 | 青青草国产精品久久久久| 亚洲国产欧洲综合997久久| 久久人爽人人爽人人片AV| 久久综合狠狠色综合伊人| 色综合合久久天天给综看| 色偷偷久久一区二区三区| 国内精品欧美久久精品| 亚洲乱码中文字幕久久孕妇黑人| 日韩精品久久久肉伦网站| 思思久久99热免费精品6| 97久久久精品综合88久久| 伊人久久大香线蕉综合热线| 国产精品毛片久久久久久久| 亚洲欧美成人久久综合中文网| 亚洲人成精品久久久久| 国产成人精品久久亚洲| 99久久精品日本一区二区免费 | 久久精品国产WWW456C0M| 久久精品国产亚洲AV久| 国产午夜精品理论片久久| 狠狠色丁香婷婷综合久久来| 亚洲AV无一区二区三区久久| 美女久久久久久| 久久久久亚洲AV成人网| 久久青青草原国产精品免费| 久久久久久无码Av成人影院 | 国产精品18久久久久久vr| 无码乱码观看精品久久| 久久久久黑人强伦姧人妻| 国产精品久久国产精麻豆99网站| 久久久久免费精品国产| 国产精品久久新婚兰兰| 亚洲欧美日韩精品久久亚洲区| 国产69精品久久久久9999| 伊人久久大香线焦综合四虎| 99久久精品日本一区二区免费| 国内精品人妻无码久久久影院| 久久综合久久自在自线精品自| 日韩精品久久无码中文字幕| 久久无码人妻一区二区三区|