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

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            STL 4: STL之容器:選擇時機,刪除元素,迭代器失效

              . 種類:

            ·            標準STL序列容器vectorstringdequelist

            ·            標準STL關聯容器setmultisetmapmultimap

            ·            非標準序列容器slistropeslist是一個單向鏈表,rope本質上是一個重型字符串

            ·            非標準關聯容器hash_sethash_multisethash_maphash_multimap

            ·            幾種標準非STL容器,包括數組、bitsetvalarraystackqueuepriority_queue

            值得注意的是,數組可以和STL算法配合,因為指針可以當作數組的迭代器使用

              .刪除元素

            如果想刪除東西,記住remove算法后,要加上erase

            所謂刪除算法,最終還是要調用成員函數去刪除某個元素,但是因為remove并不知道它現在作用于哪個容器,所以remove算法不可能真的刪除一個元素

            1.Vector

             

            vector<int> v;  

            v.reserve(10);  

            for (int i = 1; i <= 10; ++i) {

            v.push_back(i);

            }

            cout << v.size();   // 10

            v[3] = v[5] = v[9] = 99;

            remove(v.begin(), v.end(), 99);

            //v.erase(remove(v.begin(),v.end(),99),v.end());

            cout << v.size();   // 10

            2. list

            list<int> listTest;

            listTest.remove(99);//這個成員函數將真的刪除元素,并且要比erase+remove高效

            removeremove_if之間的十分相似。但unique行為也像remove。它用來從一個區間刪除東西(鄰近的重復值)而不用訪問持有區間元素的容器。如果你真的要從容器中刪除元素,你也必須成對調用uniqueeraseuniquelist中也類似于remove。正像list::remove真的刪除東西(而且比erase-remove慣用法高效得多)。list::unique也真的刪除鄰近的重復值(也比erase-unique高效)。

             

            三 迭代器失效:

             

            一個網友提的問題:

            void   main()
            {
            vector <string> vcs;
            vcs.push_back( "this   is   A ");
            vector <string   > ::iterator   it=vcs.begin();
            int   i=9;
            for(;it!=vcs.end();++it)
            {
            cout < < "caplity   of   vector   is   :   " < <vcs.size() < <endl;

            cout < < "---> " < <*it < <endl;   //
            去掉此句會有一個超過vector
                                               //
            大小的循環,高手能解釋一下為什么?
            if(i==9)
            {
            vcs.push_back( "this   is   BBBBB ");
            cout < < "vcs.push! " < <endl;
            }
            i=8;
            }
            }

            典型的迭代器失效....

             

            vector
            1.
            當插入(push_back)一個元素后,end操作返回的迭代器肯定失效。
            2.
            當插入(push_back)一個元素后,capacity返回值與沒有插入元素之前相比有改變,則需要重新加載整個容器,此時firstend操作返回的迭代器都會失效。
            3.
            當進行刪除操作(erasepop_back)后,指向刪除點的迭代器全部失效;指向刪除點后面的元素的迭代器也將全部失效。

            deque迭代器的失效情況:
            1.
            deque容器首部或者尾部插入元素不會使得任何迭代器失效。
            2.
            在其首部或尾部刪除元素則只會使指向被刪除元素的迭代器失效。
            3.
            deque容器的任何其他位置的插入和刪除操作將使指向該容器元素的所有迭代器失效。

            List/set/map

            1.刪除時,指向該刪除節點的迭代器失效

            list<int> intList;
            list<int>::iterator it = intList.begin();
            while(it != intList.end())
            {
            it = intList.erase(it);
            ……
            }

            .選擇時機<>--總結各種容器特點

            (1) vector
            內部數據結構:數組。
            隨機訪問每個元素,所需要的時間為常量。
            在末尾增加或刪除元素所需時間與元素數目無關,在中間或開頭增加或刪除元素所需時間隨元素數目呈線性變化。
            可動態增加或減少元素,內存管理自動完成,但程序員可以使用reserve()成員函數來管理內存。
            vector
            的迭代器在內存重新分配時將失效(它所指向的元素在該操作的前后不再相同)。當把超過capacity()-size()個元素插入vector中時,內存會重新分配,所有的迭代器都將失效;否則,指向當前元素以后的任何元素的迭代器都將失效。當刪除元素時,指向被刪除元素以后的任何元素的迭代器都將失效。

            (2)deque
            內部數據結構:數組。
            隨機訪問每個元素,所需要的時間為常量。
            在開頭和末尾增加元素所需時間與元素數目無關,在中間增加或刪除元素所需時間隨元素數目呈線性變化。
            可動態增加或減少元素,內存管理自動完成,不提供用于內存管理的成員函數。
            增加任何元素都將使deque的迭代器失效。在deque的中間刪除元素將使迭代器失效。在deque的頭或尾刪除元素時,只有指向該元素的迭代器失效。

            (3)list
            內部數據結構:雙向環狀鏈表。
            不能隨機訪問一個元素。
            可雙向遍歷。
            在開頭、末尾和中間任何地方增加或刪除元素所需時間都為常量。
            可動態增加或減少元素,內存管理自動完成。
            增加任何元素都不會使迭代器失效。刪除元素時,除了指向當前被刪除元素的迭代器外,其它迭代器都不會失效。

            (4)slist
            內部數據結構:單向鏈表。
            不可雙向遍歷,只能從前到后地遍歷。
            其它的特性同list相似。

            (5)stack
            適配器,它可以將任意類型的序列容器轉換為一個堆棧,一般使用deque作為支持的序列容器。
            元素只能后進先出(LIFO)。
            不能遍歷整個stack

            (6)queue
            適配器,它可以將任意類型的序列容器轉換為一個隊列,一般使用deque作為支持的序列容器。
            元素只能先進先出(FIFO)。
            不能遍歷整個queue

            (7)priority_queue
            適配器,它可以將任意類型的序列容器轉換為一個優先級隊列,一般使用vector作為底層存儲方式。
            只能訪問第一個元素,不能遍歷整個priority_queue
            第一個元素始終是優先級最高的一個元素。

            (8)set
            鍵和值相等。
            鍵唯一。
            元素默認按升序排列。
            如果迭代器所指向的元素被刪除,則該迭代器失效。其它任何增加、刪除元素的操作都不會使迭代器失效。

            (9)multiset
            鍵可以不唯一。
            其它特點與set相同。

            (10)hash_set
            set相比較,它里面的元素不一定是經過排序的,而是按照所用的hash函數分派的,它能提供更快的搜索速度(當然跟hash函數有關)。
            其它特點與set相同。

            (11)hash_multiset
            鍵可以不唯一。
            其它特點與hash_set相同。

            (12)map
            鍵唯一。
            元素默認按鍵的升序排列。
            如果迭代器所指向的元素被刪除,則該迭代器失效。其它任何增加、刪除元素的操作都不會使迭代器失效。

            (13)multimap
            鍵可以不唯一。
            其它特點與map相同。

            (14)hash_map
            map相比較,它里面的元素不一定是按鍵值排序的,而是按照所用的hash函數分派的,它能提供更快的搜索速度(當然也跟hash函數有關)。
            其它特點與map相同。

            (15)hash_multimap
            鍵可以不唯一。
            其它特點與hash_map相同。

             

             

            posted on 2009-08-31 23:08 肥仔 閱讀(638) 評論(0)  編輯 收藏 引用 所屬分類: Boost & STL

            色婷婷久久综合中文久久一本| 麻豆av久久av盛宴av| 久久国产亚洲精品无码| 国产精品久久久久久搜索 | 久久久久久av无码免费看大片 | 亚洲中文字幕无码一久久区| 久久性精品| 亚洲欧美日韩精品久久| 东京热TOKYO综合久久精品| 久久久久亚洲av无码专区| 亚洲va中文字幕无码久久| 国内精品九九久久精品| 中文字幕久久精品无码| 奇米综合四色77777久久| 午夜精品久久久久久中宇| 久久精品麻豆日日躁夜夜躁| 97久久久久人妻精品专区 | 日韩va亚洲va欧美va久久| 欧美日韩中文字幕久久久不卡 | 久久亚洲精品无码播放| 三级片免费观看久久| 香蕉久久久久久狠狠色| 亚洲熟妇无码另类久久久| 国产婷婷成人久久Av免费高清| 久久精品毛片免费观看| 国产精品免费久久| 久久午夜夜伦鲁鲁片免费无码影视| 天天躁日日躁狠狠久久| 91久久成人免费| 久久久久久国产精品美女| 国产精品久久久久国产A级| 成人国内精品久久久久影院VR| 亚洲精品国精品久久99热| 精品永久久福利一区二区| 国产福利电影一区二区三区久久久久成人精品综合 | 欧美国产成人久久精品| 97久久精品国产精品青草| 亚洲欧美另类日本久久国产真实乱对白 | 久久精品无码午夜福利理论片| 国产精品一区二区久久精品无码 | 久久精品视频一|