• <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條條款講到了刪除元素的知識,可以去看下,這里就不再贅述了。

            色婷婷久久综合中文久久一本| 国产免费福利体检区久久| yy6080久久| 狠狠色婷婷综合天天久久丁香| 久久国产精品视频| 久久人人爽人人爽人人片AV麻烦| 天天躁日日躁狠狠久久| 国产精品嫩草影院久久| 亚洲av伊人久久综合密臀性色| 一本一道久久精品综合| 亚洲中文字幕无码久久2017 | 一级做a爰片久久毛片毛片| 久久久无码一区二区三区| 久久er国产精品免费观看8| 婷婷综合久久中文字幕蜜桃三电影| 国产精品免费久久久久影院| 久久综合狠狠综合久久| 亚洲AV伊人久久青青草原| 久久久精品免费国产四虎| 久久精品国产色蜜蜜麻豆| 久久久久久久久久久免费精品| 国内精品九九久久久精品| 久久久黄色大片| 久久久免费观成人影院| 国产精品亚洲综合专区片高清久久久| 午夜精品久久久久久久久| 日韩精品久久久久久久电影| 久久久久九九精品影院| 99精品久久久久久久婷婷| 亚洲国产精品久久久久婷婷软件| 久久精品国产亚洲77777| 久久天天躁狠狠躁夜夜96流白浆| 久久精品国产日本波多野结衣| 久久婷婷色综合一区二区| 久久久久人妻一区精品果冻| 久久久久国产亚洲AV麻豆| 久久人人爽人人精品视频| 欧美精品福利视频一区二区三区久久久精品 | 久久无码人妻一区二区三区午夜| 亚洲精品无码久久一线| 亚洲熟妇无码另类久久久|