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

            四虎国产精品成人免费久久| 9191精品国产免费久久| 伊人久久亚洲综合影院| 婷婷综合久久中文字幕蜜桃三电影 | 大香伊人久久精品一区二区| 精品熟女少妇AV免费久久| 国产国产成人精品久久| 国产亚洲美女精品久久久| 久久久久亚洲AV无码专区首JN| 国产精品毛片久久久久久久| 亚洲精品午夜国产va久久| 久久99国产精品一区二区| 久久99热这里只频精品6| 欧美亚洲另类久久综合| 中文字幕久久久久人妻| 色天使久久综合网天天| 久久综合久久综合久久| 亚洲午夜无码久久久久| 人妻无码久久精品| 久久精品无码一区二区三区日韩 | 国内精品伊人久久久久av一坑| 久久香蕉国产线看观看猫咪?v| 无码人妻久久久一区二区三区| 日本欧美国产精品第一页久久| 久久综合综合久久97色| 久久亚洲欧美国产精品 | 亚洲国产小视频精品久久久三级 | 久久99精品免费一区二区| 91精品国产高清久久久久久io| 亚洲精品无码久久久久去q | 狠狠色丁香久久婷婷综合蜜芽五月| 免费国产99久久久香蕉| 久久精品国产91久久麻豆自制 | 91精品国产91久久综合| 国产精品免费福利久久| 久久中文骚妇内射| 久久久久久久人妻无码中文字幕爆| 久久午夜福利无码1000合集| 欧美日韩久久中文字幕| av色综合久久天堂av色综合在| 久久人人爽人人爽人人片AV高清 |