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

            国产精品美女久久久网AV| 久久综合狠狠综合久久综合88| 久久青青草原亚洲av无码app| 久久九九全国免费| 99精品久久久久中文字幕| 久久这里只精品国产99热| 国产成人综合久久久久久 | 久久婷婷激情综合色综合俺也去| 久久精品国产99国产电影网| 国产AV影片久久久久久| www亚洲欲色成人久久精品| 久久精品?ⅴ无码中文字幕| 人妻少妇久久中文字幕| 欧美综合天天夜夜久久| 久久久九九有精品国产| 国产精品无码久久久久久| 丁香色欲久久久久久综合网| 午夜精品久久久久久影视riav| 开心久久婷婷综合中文字幕| 久久综合伊人77777| 日本久久久久亚洲中字幕| 国产精品9999久久久久| 无夜精品久久久久久| 91秦先生久久久久久久| 无码日韩人妻精品久久蜜桃| 91亚洲国产成人久久精品网址| 国产精品久久久久乳精品爆| 久久亚洲国产成人影院网站| 无码国内精品久久人妻蜜桃| 久久综合亚洲色HEZYO社区| 精品久久久噜噜噜久久久| 久久人人爽人人人人爽AV | 久久精品人人做人人爽电影| 亚洲Av无码国产情品久久| 亚洲午夜久久久精品影院| 亚洲欧美成人综合久久久| 69国产成人综合久久精品| 欧美精品久久久久久久自慰| 综合久久国产九一剧情麻豆| 久久99国产一区二区三区| 国产伊人久久|