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

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            STL 4: STL之容器:選擇時(shí)機(jī),刪除元素,迭代器失效

              . 種類(lèi):

            ·            標(biāo)準(zhǔn)STL序列容器vectorstringdequelist

            ·            標(biāo)準(zhǔn)STL關(guān)聯(lián)容器setmultisetmapmultimap

            ·            非標(biāo)準(zhǔn)序列容器slistropeslist是一個(gè)單向鏈表,rope本質(zhì)上是一個(gè)重型字符串

            ·            非標(biāo)準(zhǔn)關(guān)聯(lián)容器hash_sethash_multisethash_maphash_multimap

            ·            幾種標(biāo)準(zhǔn)非STL容器,包括數(shù)組、bitsetvalarraystackqueuepriority_queue

            值得注意的是,數(shù)組可以和STL算法配合,因?yàn)橹羔樋梢援?dāng)作數(shù)組的迭代器使用

              .刪除元素

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

            所謂刪除算法,最終還是要調(diào)用成員函數(shù)去刪除某個(gè)元素,但是因?yàn)?span lang="EN-US">remove并不知道它現(xiàn)在作用于哪個(gè)容器,所以remove算法不可能真的刪除一個(gè)元素

            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);//這個(gè)成員函數(shù)將真的刪除元素,并且要比erase+remove高效

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

             

            三 迭代器失效:

             

            一個(gè)網(wǎng)友提的問(wèn)題:

            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;   //
            去掉此句會(huì)有一個(gè)超過(guò)vector
                                               //
            大小的循環(huán),高手能解釋一下為什么?
            if(i==9)
            {
            vcs.push_back( "this   is   BBBBB ");
            cout < < "vcs.push! " < <endl;
            }
            i=8;
            }
            }

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

             

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

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

            List/set/map

            1.刪除時(shí),指向該刪除節(jié)點(diǎn)的迭代器失效

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

            .選擇時(shí)機(jī)<轉(zhuǎn)>--總結(jié)各種容器特點(diǎn)

            (1) vector
            內(nèi)部數(shù)據(jù)結(jié)構(gòu):數(shù)組。
            隨機(jī)訪問(wèn)每個(gè)元素,所需要的時(shí)間為常量。
            在末尾增加或刪除元素所需時(shí)間與元素?cái)?shù)目無(wú)關(guān),在中間或開(kāi)頭增加或刪除元素所需時(shí)間隨元素?cái)?shù)目呈線(xiàn)性變化。
            可動(dòng)態(tài)增加或減少元素,內(nèi)存管理自動(dòng)完成,但程序員可以使用reserve()成員函數(shù)來(lái)管理內(nèi)存。
            vector
            的迭代器在內(nèi)存重新分配時(shí)將失效(它所指向的元素在該操作的前后不再相同)。當(dāng)把超過(guò)capacity()-size()個(gè)元素插入vector中時(shí),內(nèi)存會(huì)重新分配,所有的迭代器都將失效;否則,指向當(dāng)前元素以后的任何元素的迭代器都將失效。當(dāng)刪除元素時(shí),指向被刪除元素以后的任何元素的迭代器都將失效。

            (2)deque
            內(nèi)部數(shù)據(jù)結(jié)構(gòu):數(shù)組。
            隨機(jī)訪問(wèn)每個(gè)元素,所需要的時(shí)間為常量。
            在開(kāi)頭和末尾增加元素所需時(shí)間與元素?cái)?shù)目無(wú)關(guān),在中間增加或刪除元素所需時(shí)間隨元素?cái)?shù)目呈線(xiàn)性變化。
            可動(dòng)態(tài)增加或減少元素,內(nèi)存管理自動(dòng)完成,不提供用于內(nèi)存管理的成員函數(shù)。
            增加任何元素都將使deque的迭代器失效。在deque的中間刪除元素將使迭代器失效。在deque的頭或尾刪除元素時(shí),只有指向該元素的迭代器失效。

            (3)list
            內(nèi)部數(shù)據(jù)結(jié)構(gòu):雙向環(huán)狀鏈表。
            不能隨機(jī)訪問(wèn)一個(gè)元素。
            可雙向遍歷。
            在開(kāi)頭、末尾和中間任何地方增加或刪除元素所需時(shí)間都為常量。
            可動(dòng)態(tài)增加或減少元素,內(nèi)存管理自動(dòng)完成。
            增加任何元素都不會(huì)使迭代器失效。刪除元素時(shí),除了指向當(dāng)前被刪除元素的迭代器外,其它迭代器都不會(huì)失效。

            (4)slist
            內(nèi)部數(shù)據(jù)結(jié)構(gòu):?jiǎn)蜗蜴湵怼?span lang="EN-US">
            不可雙向遍歷,只能從前到后地遍歷。
            其它的特性同list相似。

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

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

            (7)priority_queue
            適配器,它可以將任意類(lèi)型的序列容器轉(zhuǎn)換為一個(gè)優(yōu)先級(jí)隊(duì)列,一般使用vector作為底層存儲(chǔ)方式。
            只能訪問(wèn)第一個(gè)元素,不能遍歷整個(gè)priority_queue
            第一個(gè)元素始終是優(yōu)先級(jí)最高的一個(gè)元素。

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

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

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

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

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

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

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

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

             

             

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

            九九久久精品无码专区| 日韩精品无码久久久久久| 久久久久国产精品| 国产福利电影一区二区三区久久久久成人精品综合 | 亚洲乱码中文字幕久久孕妇黑人| 狠狠色婷婷久久综合频道日韩| 伊人久久大香线蕉亚洲| 久久综合精品国产二区无码| 成人资源影音先锋久久资源网| 国内精品久久久久久久久电影网| 久久久国产99久久国产一| 色综合久久久久无码专区 | 伊人色综合久久天天人守人婷| 久久午夜夜伦鲁鲁片免费无码影视 | 一本大道久久香蕉成人网| 欧美午夜精品久久久久免费视| 久久国产午夜精品一区二区三区| 亚洲中文久久精品无码| 久久性生大片免费观看性| 国产欧美一区二区久久| 色诱久久久久综合网ywww | 婷婷综合久久狠狠色99h| 伊人久久综合成人网| 久久久久亚洲国产| 久久久久香蕉视频| 精品亚洲综合久久中文字幕| 亚洲欧洲日产国码无码久久99| 亚洲精品国产自在久久| 精品无码久久久久久久久久 | 亚洲精品国产字幕久久不卡| 色综合合久久天天给综看| 亚洲精品高清久久| 久久综合综合久久狠狠狠97色88| 一本一本久久A久久综合精品| 久久一区二区免费播放| 日本道色综合久久影院| 国产精品久久久久影院色| 精品久久8x国产免费观看| 久久久久国产精品熟女影院| 囯产精品久久久久久久久蜜桃| 免费久久人人爽人人爽av|