• <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>

            兔子的技術博客

            兔子

               :: 首頁 :: 聯系 :: 聚合  :: 管理
              202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

            留言簿(10)

            最新評論

            閱讀排行榜

            評論排行榜

            當一個容器變化時,指向該容器中元素的迭代器可能失效。這使得在迭代器變化期間改變容器容易出現問題。在這方面,不同的容器提供不同的保障:
            vectors: 引起內存重新分配的插入運算使所有迭代器失效,插入也使得插入位置及其后位置的迭代器失效,刪除運算使得刪除位置及其后位置的迭代器失效.
            vector的push_back操作 可能沒事,但是一旦引發內存重分配,所有迭代器都會失效;
            vector的insert操作 插入點之后的所有迭代器失效;但一旦引發內存重分配,所有迭代器都會失效;
            vector的erase操作 插入點之后的所有迭代器失效;
            vector的reserve操作 所有迭代器失效(因為它導致內存重分配);

            list/map: 插入不會使得任何迭代器失效;刪除運算使指向刪除位置的迭代器失效,但是不會失效其他迭代器.
            deque的insert操作 所有迭代器失效;
            deque的erase操作 所有迭代器失效;

            1. 對于關聯容器(如map, set, multimap,multiset),刪除當前的iterator,僅僅會使當前的iterator失效,只要在erase時,遞增當前iterator即可。這是因為map之類的容器,使用了紅黑樹來實現,插入、刪除一個結點不會對其他結點造成影響。erase迭代器只是被刪元素的迭代器失效,但是返回值為void,所以要采用erase(iter++)的方式刪除迭代器。
            for (iter = cont.begin(); it != cont.end();)
            {
               (*iter)->doSomething();
               if (shouldDelete(*iter))
                  cont.erase(iter++);
               else
                  ++iter;
            }

            2. 對于序列式容器(如vector,deque),刪除當前的iterator會使后面所有元素的iterator都失效。這是因為vetor,deque使用了連續分配的內存,刪除一個元素導致后面所有的元素會向前移動一個位置。所以不能使用erase(iter++)的方式,還好erase方法可以返回下一個有效的iterator。
            for (iter = cont.begin(); iter != cont.end();)
            {
               (*it)->doSomething();
               if (shouldDelete(*iter))
                  iter = cont.erase(iter); 
               else
                  ++iter;
            }
            3. 對于list來說,它使用了不連續分配的內存,并且它的erase方法也會返回下一個有效的iterator,因此上面兩種方法都可以使用。

            刪除數組中某個元素后連續重復的元素,例如 1,1,2,3,3,1,1,1,4,0 ---> 1, 2,3,1,4,0。給出問題的一個正確的實現:
            #include <iostream>  
            #include 
            <vector>  
            using namespace std;  
              
            int main(int argc, char* argv[])  
            {  
               
            int a[] = {11333241110};  
               
            int size = sizeof(a)/sizeof(a[0]);  
              
              
               vector
            <int> vec(a, a+size);  
              
              
               vector
            <int>::iterator iter = vec.begin();  
               
            int previous = *iter;  
               
            ++iter;  
               
            for (; iter != vec.end();)  
               {          
                  
            if(*iter == previous)  
                  {  
                     iter 
            = vec.erase(iter);  
                  }  
                  
            else  
                  {  
                     previous 
            = *iter;  
                     
            ++iter;  
                  }      
               }  
              
              
               
            for(iter = vec.begin(); iter != vec.end(); ++iter)  
               {  
                  cout 
            << *iter << endl;  
               }  
                 
               
            return 0;  
            }  
            PS. 不過實際上這個問題,用vector來實現不是很適合,因為每次刪除一個元素,都會引起vector的一個resize操作。resize的時間復雜度是O(n),整個的resize操作要花費O(n^2)。最好是選擇list最為容器,list最適合那些需要在容器中間做插入、刪除的例子。

            轉自:http://blog.csdn.net/heyutao007/article/details/6937236
            posted on 2013-09-24 21:12 會飛的兔子 閱讀(480) 評論(0)  編輯 收藏 引用 所屬分類: C++庫,組件
            国产精品欧美久久久天天影视| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 日产精品久久久一区二区| 91精品国产色综合久久| 精品无码久久久久久国产| 久久无码AV一区二区三区| 久久精品国产亚洲AV电影 | 久久精品中文字幕大胸| 久久国产精品99国产精| 久久无码国产| 久久青草国产手机看片福利盒子| 亚洲国产精品综合久久网络| 久久国产成人精品麻豆| 2021国内久久精品| 久久WWW免费人成—看片| 久久99热只有频精品8| 一级做a爰片久久毛片毛片| 久久综合综合久久狠狠狠97色88 | 久久久久se色偷偷亚洲精品av| 国产成人综合久久精品尤物| 无码人妻久久久一区二区三区| 久久精品成人免费观看97| 久久99热国产这有精品| 久久亚洲AV成人无码电影| 97香蕉久久夜色精品国产| 天天综合久久一二三区| 精品久久人人爽天天玩人人妻| 99久久99久久| 久久精品国产第一区二区三区| 亚洲午夜久久久影院| 久久久久久国产精品无码下载| 伊人久久成人成综合网222| 欧美精品一区二区久久| 久久久久亚洲AV无码去区首| 久久久久久亚洲精品不卡 | 成人久久久观看免费毛片| 无码人妻精品一区二区三区久久| 成人午夜精品无码区久久| 亚洲AV无码1区2区久久| 久久亚洲中文字幕精品有坂深雪| 久久久久亚洲AV无码网站|