• <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ù)目呈線性變化。
            可動(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ù)目呈線性變化。
            可動(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 肥仔 閱讀(644) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Boost & STL

            久久亚洲国产精品123区| 国产精品久久久久9999| 久久精品免费一区二区| 久久亚洲美女精品国产精品| 久久精品a亚洲国产v高清不卡| 久久电影网2021| 久久久久久精品成人免费图片| 久久精品天天中文字幕人妻| 国产精品久久久久久久午夜片 | 国内精品久久久久久久久电影网| 久久久免费观成人影院| 久久综合久久自在自线精品自| 国产69精品久久久久99尤物| 精品国产99久久久久久麻豆| 欧美伊香蕉久久综合类网站| 少妇人妻88久久中文字幕| 精品国产综合区久久久久久| 久久青青草原精品国产| 97视频久久久| 伊人久久大香线蕉AV一区二区| 国产精品久久久久影院嫩草| 奇米综合四色77777久久| 亚洲精品无码久久久久AV麻豆| 久久99久久成人免费播放| 国产精品久久久久影院嫩草| 久久精品夜夜夜夜夜久久| 亚洲AV成人无码久久精品老人| 亚洲精品综合久久| 久久人人添人人爽添人人片牛牛| 久久天天日天天操综合伊人av| 91精品国产91热久久久久福利 | 欧美日韩精品久久久久| 久久www免费人成看国产片| 国产精品久久99| 成人资源影音先锋久久资源网| 国产情侣久久久久aⅴ免费| 日韩乱码人妻无码中文字幕久久 | 国产欧美久久一区二区| 久久久久亚洲av无码专区喷水 | 国内精品欧美久久精品| 国产精品美女久久久久AV福利|