• <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++庫,組件
            国产69精品久久久久观看软件 | 日本精品久久久久中文字幕8| 色88久久久久高潮综合影院| 无码AV波多野结衣久久| 欧美精品一区二区精品久久 | 亚洲国产精品无码久久久久久曰 | 老司机国内精品久久久久| 久久久久久国产精品美女| 综合人妻久久一区二区精品| 欧美亚洲国产精品久久蜜芽| 人妻无码精品久久亚瑟影视| 国产情侣久久久久aⅴ免费| 亚洲国产成人久久精品99| 久久久噜噜噜www成人网| 18禁黄久久久AAA片| 人人狠狠综合久久亚洲婷婷| 久久久久久久久久久久中文字幕| 久久综合九色综合久99| 久久久久久毛片免费看| 国产精品99久久99久久久| 精品伊人久久久| 国产综合成人久久大片91| 久久国产乱子精品免费女| av无码久久久久久不卡网站| 无夜精品久久久久久| 久久久精品视频免费观看| 国产亚洲美女精品久久久久狼| 国产成人精品三上悠亚久久| 亚洲国产成人精品无码久久久久久综合 | 亚洲国产欧洲综合997久久| 久久久久久久综合综合狠狠| 91精品婷婷国产综合久久 | 大香伊人久久精品一区二区| 久久久久97国产精华液好用吗| AAA级久久久精品无码区| 93精91精品国产综合久久香蕉| 久久精品国产亚洲AV无码偷窥| 久久久无码精品亚洲日韩蜜臀浪潮| 色欲综合久久中文字幕网| 久久香综合精品久久伊人| 亚洲中文久久精品无码ww16|