• <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>
            posts - 311, comments - 0, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
            為了說明白兩者,我首先用erase()函數寫一個程序,目的是從已經存在的int型容器中刪除值為3的元素,代碼如下:
            #include <iostream>
            #include 
            <vector>
            using namespace std;
            int main()
            {
                vector
            <int> ivec;
                
            int i;
                vector
            <int>::iterator it;
                
            for(i = 0;i < 10;++i)
                    ivec.push_back(i);
                
            for(i = 0;i < 10;++i)
                    ivec.push_back(i);
                 
            for(it = ivec.begin();it != ivec.end();++it)
                    
            if(*it == 3)
                        ivec.erase(it);   
            //此處執行的是刪除操作
                for(it = ivec.begin();it != ivec.end();++it)
                    cout
            <<*it<<endl;
                
            return 0;
            }
                  但最終的結果閉并不是我所想要的,出現了如下錯誤:


                  不用多想,就應該能猜出錯誤的根源,因為erase()操作會使后面的迭代器失效,當刪除掉第一個值為3的元素后,后面的迭代器跟之前的迭代器不同了,如果還是在以前迭代器的基礎上進行++操作的話,就會出現上面的問題,在C++ Primer中的9.2.2節也提到了這一點,使用erase()操作后,任何指向已刪除元素的迭代器都具有無效值,畢竟該迭代器指向了容器中不再存在的元素。

                  如果想比較保險的刪除容器中的一個元素的話,還是推薦使用泛型算法remove_if()好了,首先需要指出的是,泛型算法不依賴于特定的容器類型,它是“泛型”的,可作用在不同類型的容器和不同類型的元素上。此外,還有這些算法從不使用容器操作,因而其實現和類型無關,元素的訪問和遍歷都是通過迭代器實現的,泛型算法可能會改變存儲在容器中的元素的值,也許會在容器中移動元素,但是,算法從不直接添加或者刪除元素。

                  首先介紹下msdn中對remove_if()的介紹:
            算法的功能是:Eliminates elements that satisfy a predicate from a given range without disturbing the order of the remaining elements and returning the end of a new range free of the specified value.
            翻譯過來就是說:在一個給定范圍內刪除滿足一定條件的元素,在刪除元素的過程中不改變剩余元素的位置,并同時返回一個沒有要刪除元素的新容器的迭代器end值。
            我們可以利用這個remove_if()的返回值來刪除剩余的元素,這個只需要加入語句ivec.erase(remove_if(****),ivec.end());就可以了。

            用remove()和remove_if()其實都可以很簡單的解決在上個程序中要解決的問題,remove()的返回值跟remove_if()的返回值是一樣的,程序如下:

            #include <iostream>
            #include 
            <vector>
            #include 
            <algorithm>
            using namespace std;
            //bool compare(int d)
            //{
            //    return d == 3;
            //}
            int main()
            {
                vector
            <int> ivec;
                
            int i;
                vector
            <int>::iterator it;
                
            for(i = 0;i < 5;++i)
                    ivec.push_back(i);
                
            for(i = 0;i < 5;++i)
                    ivec.push_back(i);
                
            //it = remove_if(ivec.begin(),ivec.end(),compare);
                it = remove(ivec.begin(),ivec.end(),3);
                ivec.erase(it,ivec.end());
                
            for(vector<int>::iterator it = ivec.begin();it != ivec.end();++it)
                    cout
            <<*it<<endl;
                
            return 0;
            }

             

                  剛才看到Effective C++中有關于這方面的知識,第32條條款講到了刪除元素的知識,可以去看下,這里就不再贅述了。

            国产精品9999久久久久| 草草久久久无码国产专区| 久久精品国产黑森林| 理论片午午伦夜理片久久| 亚洲精品97久久中文字幕无码| 久久久久久久久久久精品尤物| 国产午夜免费高清久久影院| 国产成人精品久久亚洲高清不卡 | 精品综合久久久久久88小说| 久久人妻少妇嫩草AV蜜桃| 日本精品久久久中文字幕| 一级女性全黄久久生活片免费| 久久99精品久久只有精品| 亚洲国产精品狼友中文久久久| 国产精品女同久久久久电影院| 色诱久久av| 精品欧美一区二区三区久久久| 亚洲精品乱码久久久久久按摩 | 国产精品视频久久| 青青青青久久精品国产h久久精品五福影院1421 | 久久影视综合亚洲| 色综合久久综精品| 久久99精品久久久久子伦| 免费久久人人爽人人爽av| 久久伊人色| 久久男人AV资源网站| 伊人热人久久中文字幕| 99久久无色码中文字幕| 日韩人妻无码精品久久久不卡 | 国内精品久久久久久久亚洲| 久久99国产综合精品女同| 亚洲精品乱码久久久久久蜜桃图片| 久久亚洲AV无码西西人体| 久久er国产精品免费观看8| 日韩亚洲欧美久久久www综合网 | 国内精品伊人久久久久AV影院| 99久久精品国产一区二区| 久久久久久久91精品免费观看| 伊人久久大香线蕉综合热线| 久久激情亚洲精品无码?V| 欧美亚洲日本久久精品|