日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

STL容器学习总结

發(fā)布時(shí)間:2024/7/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL容器学习总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
???? 本文主要討論C++標(biāo)準(zhǔn)庫(kù)中的順序容器及相應(yīng)的容器適配器,這些內(nèi)容主要涉及順序容器類(lèi)型:vector、list、deque,順序容器適配器類(lèi)型:stack、queue、priority_queue。
????? 標(biāo)準(zhǔn)庫(kù)中的容器分為順序容器和關(guān)聯(lián)容器。順序容器(sequential container)內(nèi)的元素按其位置存儲(chǔ)和訪問(wèn),顧名思義,這些內(nèi)部元素是順序存放的;順序容器內(nèi)的元素排列次序與元素值無(wú)關(guān),而是由元素添加到容器里的次序決定。而關(guān)聯(lián)容器的元素按鍵(key)排序。
容器類(lèi)共享部分公共接口。標(biāo)準(zhǔn)庫(kù)定義的三種順序容器類(lèi)型:vector、list、deque(double-ended queue的縮寫(xiě),發(fā)音為“deck”),它們的差別僅在訪問(wèn)元素的方式,以及添加或刪除元素相關(guān)操作的代價(jià)。順序容器適配器包括:stack、queue和priority_queue。容器只定義了少量操作,大多數(shù)操作由算法庫(kù)提供。如果兩個(gè)容器提供了相同的操作,則它們的接口(函數(shù)名和參數(shù)個(gè)數(shù))應(yīng)該相同。?

標(biāo)準(zhǔn)容器類(lèi)說(shuō)明
順序性容器
vector從后面快速的插入與刪除,直接訪問(wèn)任何元素
deque從前面或后面快速的插入與刪除,直接訪問(wèn)任何元素
list雙鏈表,從任何地方快速插入與刪除
關(guān)聯(lián)容器
set快速查找,不允許重復(fù)值
multiset快速查找,允許重復(fù)值
map一對(duì)多映射,基于關(guān)鍵字快速查找,不允許重復(fù)值
multimap一對(duì)多映射,基于關(guān)鍵字快速查找,允許重復(fù)值
容器適配器
stack后進(jìn)先出
queue先進(jìn)先出
priority_queue最高優(yōu)先級(jí)元素總是第一個(gè)出列

????? 容器類(lèi)型

?vector?容器,支持快速隨機(jī)訪問(wèn)(連續(xù)存儲(chǔ))?
?list?鏈表,支持快速插入/刪除
?deque?雙端隊(duì)列,支持隨機(jī)訪問(wèn)(連續(xù)存儲(chǔ)),兩端能快速插入和刪除
?stack?棧
?queue?隊(duì)列
?priority_queue?優(yōu)先級(jí)隊(duì)列
順序容器的定義 順序容器的構(gòu)造和初始化 下表為迭代器為所有容器類(lèi)型所提供的運(yùn)算:
?*iter?返回類(lèi)型iter所指向的元素的引用?
?iter->mem?對(duì)iter進(jìn)行解引用,并取得指定成員
?++iter?給iter加1,使其指向容器中下一個(gè)元素
?iter++?
?--iter?給iter減1,使其指向容器中前一個(gè)元素
?iter--?
?iter1 == iter2?當(dāng)兩個(gè)迭代器指向同一個(gè)容器中的同一元素,或者當(dāng)它們都指向
?iter1 != iter2?同一個(gè)容器的超出末端的下一個(gè)位置時(shí),兩個(gè)迭代器相等。
vector和deque容器的迭代器提供了額外的運(yùn)算:迭代器的算術(shù)運(yùn)算和另一些關(guān)系運(yùn)算,如下表所示:
?iter + n?在迭代器上加(減)整數(shù)值,將產(chǎn)生指向容器中前面(后面)第n個(gè)元素的迭代器;
?iter - n?新計(jì)算出來(lái)的迭代器必須指向容器中的元素或超出容器末端的下一位置。
?iter1 += iter2?復(fù)合運(yùn)算:先加(減),再賦值
?iter1 -= iter2?
?iter1 - iter2?只適用于vector和deque
?>, >=, <, <=?比較迭代器的位置關(guān)系;只適用于vector和deque
關(guān)系操作符只適用于vector和deque容器,這是因?yàn)橹挥羞@兩種容器為其元素提供快速、隨機(jī)的訪問(wèn)。它們確保可根據(jù)元素位置直接有效地訪問(wèn)指定的容器元素。這兩種容器都支持通過(guò)元素位置實(shí)現(xiàn)的隨機(jī)訪問(wèn),因此它們的迭代器可以有效地實(shí)現(xiàn)算術(shù)和關(guān)系運(yùn)算。 迭代器范圍:[first, last)是一個(gè)左閉合區(qū)間,表示范圍從first開(kāi)始,到last結(jié)束,但不包括last。注意:如果first不等于last,則對(duì)first反復(fù)做自增運(yùn)算必須能夠到達(dá)last;否則,即last位于first之前,則將發(fā)生未定義行為。 迭代器范圍使用左閉合的意義:因?yàn)檫@樣可以統(tǒng)一表示空集,就無(wú)需特別處理。 另外,使用迭代器時(shí),要特別留意迭代器的可能的失效問(wèn)題。 訪問(wèn)元素
?back()?返回容器的最后一個(gè)元素的引用。如果容器為空,則該操作未定義
?front()?返回容器的第一個(gè)元素的引用。如果容器為空,則該操作未定義
?c[n]

?返回下標(biāo)為n的元素的引用;如果n<0 or n>=size(),則該操作未定義
?(注:只適用于vector和deque容器

?at[n]?返回下標(biāo)為n的元素的引用;如果下標(biāo)無(wú)效,則拋出異常out_of_range異常
?(注:只適用于vector和deque容器
刪除元素??
?erase(p)?刪除迭代器p所指向的元素。返回一個(gè)迭代器,它指向被刪除的元素后面的元素。如果p指向容器內(nèi)最后一個(gè)元素,則返回的迭代器指向容器的超出末端的下一個(gè)位置;如果p本身就是指向超出末端的下一個(gè)位置的迭代器,則該函數(shù)未定義
?erase(b, e)?刪除[b, e)內(nèi)的所有元素。返回一個(gè)迭代器,它指向被刪除元素段后面的元素。如果e本身就是指向超出末端的下一個(gè)位置的迭代器,則返回的迭代器也指向超出末端的下一個(gè)位置。
?clear()?刪除容器內(nèi)的所有元素,返回void
?pop_back()?刪除容器內(nèi)的最后一個(gè)元素,返回void。如果容器為空,則該操作未定義。
?pop_front()?刪除容器內(nèi)的第一個(gè)元素,返回void。如果c為空容器,則該操作未定義
?(注:只適用于list和deque容器
賦值與swap
?c1 = c2?刪除容器c1的所有元素,然后將c2的元素復(fù)制給c1。c1和c2的類(lèi)型必須相同。
?c1.swap(c2)?交換內(nèi)容:調(diào)用該函數(shù)后,c1中存放的是c2原來(lái)的元素,c2中存放的是c1原來(lái)的元素。c1和c2的類(lèi)型必須相同。該函數(shù)的執(zhí)行速度通常要比將c2的元素復(fù)制到c1的操作快。
?c.assign(b, e)

?重新設(shè)置c的元素:將迭代器b和e標(biāo)記的范圍內(nèi)所有的元素復(fù)制到c中。b和e必須不是指向c中元素的迭代器。

?c.assign(n, t)?將容器c重新設(shè)置為存儲(chǔ)n個(gè)值為t的元素。
注意:assign操作首先刪除容器內(nèi)所有的元素,再將參數(shù)所指定的新元素插入到容器中。 swap操作不會(huì)刪除或插入任何元素,而且保證在常量時(shí)間內(nèi)實(shí)現(xiàn)交換。由于容器內(nèi)沒(méi)有移動(dòng)任何元素,因此迭代器不會(huì)失效。但要注意這些迭代器指向了另一個(gè)容器中的元素。 容器的選用: vector和deque容器提供了對(duì)元素的快速訪問(wèn),但付出的代價(jià)是,在容器的任意位置插入或刪除元素,比在容器尾部插入和刪除的開(kāi)銷(xiāo)更大,因?yàn)橐WC其連續(xù)存儲(chǔ),需要移動(dòng)元素;list類(lèi)型在任何位置都能快速插入和刪除,因?yàn)椴恍枰WC連續(xù)存儲(chǔ),但付出的代價(jià)是元素的隨機(jī)訪問(wèn)開(kāi)銷(xiāo)較大。特征如下: ?? 1)與vector容器一樣,在deque容器的中間insert或erase元素效率比較低; ?? 2)不同于vector容器,deque容器提供高效地在其首部實(shí)現(xiàn)insert和erase的操作,就像在尾部一樣; ?? 3)與vector容器一樣而不同于list容器的是,deque容器支持對(duì)所有元素的隨機(jī)訪問(wèn)。 ?? 4)在deque容器首部或尾部刪除元素則只會(huì)使指向被刪除元素的迭代器失效。在deque容器的任何其他位置的插入和刪除操作將使指向該容器元素的所有迭代器都失效。 容器的比較:

vector (連續(xù)的空間存儲(chǔ),可以使用[]操作符)快速的訪問(wèn)隨機(jī)的元素,快速的在末尾插入元素,但是在序列中間歲間的插入,刪除元素要慢,而且如果一開(kāi)始分配的空間不夠的話,有一個(gè)重新分配更大空間,然后拷貝的性能開(kāi)銷(xiāo)。
deque?(小片的連續(xù),小片間用鏈表相連,實(shí)際上內(nèi)部有一個(gè)map的指針,因?yàn)橹李?lèi)型,所以還是可以使用[],只是速度沒(méi)有vector快)快速的訪問(wèn)隨機(jī)的元素,快速的在開(kāi)始和末尾插入元素,隨機(jī)的插入,刪除元素要慢,空間的重新分配要比vector快,重新分配空間后,原有的元素不需要拷貝。對(duì)deque的排序操作,可將deque先復(fù)制到vector,排序后在復(fù)制回deque。
list?(每個(gè)元素間用鏈表相連)訪問(wèn)隨機(jī)元素不如vector快,隨機(jī)的插入元素比vector快,對(duì)每個(gè)元素分配空間,所以不存在空間不夠,重新分配的情況。


set:內(nèi)部元素唯一,用一棵平衡樹(shù)結(jié)構(gòu)來(lái)存儲(chǔ),因此遍歷的時(shí)候就排序了,查找也比較快的哦。
map :一對(duì)一的映射的結(jié)合,key不能重復(fù)。

stack :適配器,必須結(jié)合其他的容器使用,stl中默認(rèn)的內(nèi)部容器是deque。先進(jìn)后出,只有一個(gè)出口,不允許遍歷。
queue: 是受限制的deque,內(nèi)部容器一般使用list較簡(jiǎn)單。先進(jìn)先出,不允許遍歷。
vector<bool> 與bitset<> ,前面的可以動(dòng)態(tài)改變長(zhǎng)度。
priority_queue: 插入的元素就有優(yōu)先級(jí)順序,top出來(lái)的就是優(yōu)先級(jí)最高的了
valarray 專(zhuān)門(mén)進(jìn)行數(shù)值計(jì)算的,增加特殊的數(shù)學(xué)函數(shù)。

一些容器選用法則: 1)如果程序要求隨機(jī)訪問(wèn)元素,則應(yīng)使用vector或deque容器; 2)如果程序必須在容器的中間位置插入或刪除元素,則應(yīng)采用list容器; 3)如果程序不是在容器的中間位置,而是在容器首部或尾部插入或刪除元素,則應(yīng)采用deque容器; 4)如果只需要在讀取輸入時(shí)在容器的中間位置插入元素,然后需要隨機(jī)訪問(wèn)元素,則可以在輸入時(shí)將元素讀入到一個(gè)list容器中,然后對(duì)容器排序,再將排序后的list容器復(fù)制到vector容器中。 5)如果程序既需要隨機(jī)訪問(wèn),又需要在容器的中間位置插入或刪除元素,此時(shí)應(yīng)當(dāng)權(quán)衡哪種操作的影響較大,從而決定選擇list容器還是vector或deque容器。注:此時(shí)若選擇使用vector或deque容器,可以考慮只使用它們和list容器所共有的操作,比如使用迭代器而不是下標(biāo),避免隨機(jī)訪問(wèn)元素等,這樣在必要時(shí),可以很方便地將程序改寫(xiě)為使用list容器。 容器適配器 適配器(adaptor)是標(biāo)準(zhǔn)庫(kù)中通用的概念,包括容器適配器、迭代器適配器和函數(shù)適配器。本質(zhì)上,適配器是使一事物的行為類(lèi)似于另一事物的行為的一種機(jī)制。容器適配器讓一種已存在的容器類(lèi)型采用另一種不同的抽象類(lèi)型的工作方式實(shí)現(xiàn),只是發(fā)生了接口轉(zhuǎn)換而已。 標(biāo)準(zhǔn)庫(kù)提供了三種順序容器適配器:queue, priority_queue和stack。 所有適配器都定義了兩個(gè)構(gòu)造函數(shù):默認(rèn)構(gòu)造函數(shù)用于創(chuàng)建空對(duì)象,而帶一個(gè)容器參數(shù)的構(gòu)造函數(shù)將參數(shù)容器的副本作為其基礎(chǔ)值。 默認(rèn)的stack和queue都基于deque容器實(shí)現(xiàn),而priority_queue則在vector容器上實(shí)現(xiàn)。在創(chuàng)建適配器時(shí),通過(guò)將一個(gè)順序容器指定為適配器的第二個(gè)類(lèi)型參數(shù),可覆蓋其關(guān)聯(lián)的基礎(chǔ)容器類(lèi)型。例如: stack<int, vector<int> > int_stack;? // 此時(shí),int-stack棧是基于vector實(shí)現(xiàn) 對(duì)于給定的適配器,其關(guān)聯(lián)的容器必須滿足一定的約束條件。stack適配器所關(guān)聯(lián)的基本容器可以是任意一種順序容器類(lèi)型,因?yàn)檫@些容器類(lèi)型都提供了push_back、pop_back和back操作;queue適配器要求其關(guān)聯(lián)的基礎(chǔ)容器必須提供pop_front操作,因此其不能建立在vector容器上;priority_queue適配器要求提供隨機(jī)訪問(wèn)功能,因此不能建立在list容器上。 兩個(gè)相同類(lèi)型的適配器可以做==, !=, <, >, <=, >=這些關(guān)系運(yùn)算,只要其基本元素類(lèi)型支持==和<兩個(gè)操作即可。這與容器大小比較原則一致。 這與容器大小比較原則一致。
?s.empty()?如果棧為這人,則true;否則返回false
?s.size()?返回棧中元素的個(gè)數(shù)
?s.pop()?刪除棧頂元素,但不返回其值
?s.top()?返回棧頂元素的值,但不刪除該元素
?s.push(item)?在棧項(xiàng)壓入新元素
隊(duì)列和優(yōu)先級(jí)隊(duì)列 標(biāo)準(zhǔn)庫(kù)隊(duì)列使用了先進(jìn)先出(FIFO)的存儲(chǔ)和檢索策略,進(jìn)入隊(duì)列的元素被放置在尾部,下一個(gè)被取出的元素則取自隊(duì)列的首部。 priority_queue默認(rèn)使用元素類(lèi)型的 < 操作符來(lái)確定它們之間的優(yōu)先級(jí)關(guān)系,用戶(hù)也可以定義自己的優(yōu)先級(jí)關(guān)系。在優(yōu)先級(jí)隊(duì)列中,新元素被放置在比它優(yōu)先級(jí)低的元素的前面。
?q.empty()?如果隊(duì)列為空,則返回true;否則返回false
?q.size()?返回隊(duì)列中元素的個(gè)數(shù)
?q.pop()?刪除隊(duì)首元素,但不返回其值
?q.front()?返回隊(duì)首元素的值,但不刪除該元素
?(注:該操作只適用于隊(duì)列
?q.back()?返回隊(duì)尾元素的值,但不刪除該元素
?(注:該操作只適用于隊(duì)列
?q.top()

?返回具有最高優(yōu)先級(jí)的元素值,但不刪除該元素
?(注:該操作只適用于優(yōu)先級(jí)隊(duì)列。MSDN也為queue提供了該操作

?q.push(item)?對(duì)于queue,在隊(duì)尾壓入一個(gè)新元素;
?對(duì)于priority_queue,在基于優(yōu)先級(jí)的適當(dāng)位置插入新元素

總結(jié)

以上是生活随笔為你收集整理的STL容器学习总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。