STL容器学习总结
????? 標(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)排序。 容器類共享部分公共接口。標(biāo)準(zhǔn)庫(kù)定義的三種順序容器類型: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)容器類 | 說(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è)出列 |
????? 容器類型
| ?vector | ?容器,支持快速隨機(jī)訪問(wèn)(連續(xù)存儲(chǔ))? |
| ?list | ?鏈表,支持快速插入/刪除 |
| ?deque | ?雙端隊(duì)列,支持隨機(jī)訪問(wèn)(連續(xù)存儲(chǔ)),兩端能快速插入和刪除 |
| ?stack | ?棧 |
| ?queue | ?隊(duì)列 |
| ?priority_queue | ?優(yōu)先級(jí)隊(duì)列 |
| ?*iter | ?返回類型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è)迭代器相等。 |
| ?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 |
| ?back() | ?返回容器的最后一個(gè)元素的引用。如果容器為空,則該操作未定義 |
| ?front() | ?返回容器的第一個(gè)元素的引用。如果容器為空,則該操作未定義 |
| ?c[n] | ?返回下標(biāo)為n的元素的引用;如果n<0 or n>=size(),則該操作未定義 |
| ?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容器) |
| ?c1 = c2 | ?刪除容器c1的所有元素,然后將c2的元素復(fù)制給c1。c1和c2的類型必須相同。 |
| ?c1.swap(c2) | ?交換內(nèi)容:調(diào)用該函數(shù)后,c1中存放的是c2原來(lái)的元素,c2中存放的是c1原來(lái)的元素。c1和c2的類型必須相同。該函數(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的元素。 |
vector (連續(xù)的空間存儲(chǔ),可以使用[]操作符)快速的訪問(wèn)隨機(jī)的元素,快速的在末尾插入元素,但是在序列中間歲間的插入,刪除元素要慢,而且如果一開(kāi)始分配的空間不夠的話,有一個(gè)重新分配更大空間,然后拷貝的性能開(kāi)銷。
deque?(小片的連續(xù),小片間用鏈表相連,實(shí)際上內(nèi)部有一個(gè)map的指針,因?yàn)橹李愋?#xff0c;所以還是可以使用[],只是速度沒(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 專門進(jìn)行數(shù)值計(jì)算的,增加特殊的數(shù)學(xué)函數(shù)。
| ?s.empty() | ?如果棧為這人,則true;否則返回false |
| ?s.size() | ?返回棧中元素的個(gè)數(shù) |
| ?s.pop() | ?刪除棧頂元素,但不返回其值 |
| ?s.top() | ?返回棧頂元素的值,但不刪除該元素 |
| ?s.push(item) | ?在棧項(xiàng)壓入新元素 |
| ?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í)的元素值,但不刪除該元素 |
| ?q.push(item) | ?對(duì)于queue,在隊(duì)尾壓入一個(gè)新元素; ?對(duì)于priority_queue,在基于優(yōu)先級(jí)的適當(dāng)位置插入新元素 |
總結(jié)
- 上一篇: 百度笔试题:malloc/free与ne
- 下一篇: 淘宝2011.9.21校园招聘会笔试题