STL容器学习总结
????? 標準庫中的容器分為順序容器和關聯容器。順序容器(sequential container)內的元素按其位置存儲和訪問,顧名思義,這些內部元素是順序存放的;順序容器內的元素排列次序與元素值無關,而是由元素添加到容器里的次序決定。而關聯容器的元素按鍵(key)排序。 容器類共享部分公共接口。標準庫定義的三種順序容器類型:vector、list、deque(double-ended queue的縮寫,發音為“deck”),它們的差別僅在訪問元素的方式,以及添加或刪除元素相關操作的代價。順序容器適配器包括:stack、queue和priority_queue。容器只定義了少量操作,大多數操作由算法庫提供。如果兩個容器提供了相同的操作,則它們的接口(函數名和參數個數)應該相同。?
| 標準容器類 | 說明 |
| 順序性容器 | |
| vector | 從后面快速的插入與刪除,直接訪問任何元素 |
| deque | 從前面或后面快速的插入與刪除,直接訪問任何元素 |
| list | 雙鏈表,從任何地方快速插入與刪除 |
| 關聯容器 | |
| set | 快速查找,不允許重復值 |
| multiset | 快速查找,允許重復值 |
| map | 一對多映射,基于關鍵字快速查找,不允許重復值 |
| multimap | 一對多映射,基于關鍵字快速查找,允許重復值 |
| 容器適配器 | |
| stack | 后進先出 |
| queue | 先進先出 |
| priority_queue | 最高優先級元素總是第一個出列 |
????? 容器類型
| ?vector | ?容器,支持快速隨機訪問(連續存儲)? |
| ?list | ?鏈表,支持快速插入/刪除 |
| ?deque | ?雙端隊列,支持隨機訪問(連續存儲),兩端能快速插入和刪除 |
| ?stack | ?棧 |
| ?queue | ?隊列 |
| ?priority_queue | ?優先級隊列 |
| ?*iter | ?返回類型iter所指向的元素的引用? |
| ?iter->mem | ?對iter進行解引用,并取得指定成員 |
| ?++iter | ?給iter加1,使其指向容器中下一個元素 |
| ?iter++ | ? |
| ?--iter | ?給iter減1,使其指向容器中前一個元素 |
| ?iter-- | ? |
| ?iter1 == iter2 | ?當兩個迭代器指向同一個容器中的同一元素,或者當它們都指向 |
| ?iter1 != iter2 | ?同一個容器的超出末端的下一個位置時,兩個迭代器相等。 |
| ?iter + n | ?在迭代器上加(減)整數值,將產生指向容器中前面(后面)第n個元素的迭代器; |
| ?iter - n | ?新計算出來的迭代器必須指向容器中的元素或超出容器末端的下一位置。 |
| ?iter1 += iter2 | ?復合運算:先加(減),再賦值 |
| ?iter1 -= iter2 | ? |
| ?iter1 - iter2 | ?只適用于vector和deque |
| ?>, >=, <, <= | ?比較迭代器的位置關系;只適用于vector和deque |
| ?back() | ?返回容器的最后一個元素的引用。如果容器為空,則該操作未定義 |
| ?front() | ?返回容器的第一個元素的引用。如果容器為空,則該操作未定義 |
| ?c[n] | ?返回下標為n的元素的引用;如果n<0 or n>=size(),則該操作未定義 |
| ?at[n] | ?返回下標為n的元素的引用;如果下標無效,則拋出異常out_of_range異常 ?(注:只適用于vector和deque容器) |
| ?erase(p) | ?刪除迭代器p所指向的元素。返回一個迭代器,它指向被刪除的元素后面的元素。如果p指向容器內最后一個元素,則返回的迭代器指向容器的超出末端的下一個位置;如果p本身就是指向超出末端的下一個位置的迭代器,則該函數未定義 |
| ?erase(b, e) | ?刪除[b, e)內的所有元素。返回一個迭代器,它指向被刪除元素段后面的元素。如果e本身就是指向超出末端的下一個位置的迭代器,則返回的迭代器也指向超出末端的下一個位置。 |
| ?clear() | ?刪除容器內的所有元素,返回void |
| ?pop_back() | ?刪除容器內的最后一個元素,返回void。如果容器為空,則該操作未定義。 |
| ?pop_front() | ?刪除容器內的第一個元素,返回void。如果c為空容器,則該操作未定義 ?(注:只適用于list和deque容器) |
| ?c1 = c2 | ?刪除容器c1的所有元素,然后將c2的元素復制給c1。c1和c2的類型必須相同。 |
| ?c1.swap(c2) | ?交換內容:調用該函數后,c1中存放的是c2原來的元素,c2中存放的是c1原來的元素。c1和c2的類型必須相同。該函數的執行速度通常要比將c2的元素復制到c1的操作快。 |
| ?c.assign(b, e) | ?重新設置c的元素:將迭代器b和e標記的范圍內所有的元素復制到c中。b和e必須不是指向c中元素的迭代器。 |
| ?c.assign(n, t) | ?將容器c重新設置為存儲n個值為t的元素。 |
vector (連續的空間存儲,可以使用[]操作符)快速的訪問隨機的元素,快速的在末尾插入元素,但是在序列中間歲間的插入,刪除元素要慢,而且如果一開始分配的空間不夠的話,有一個重新分配更大空間,然后拷貝的性能開銷。
deque?(小片的連續,小片間用鏈表相連,實際上內部有一個map的指針,因為知道類型,所以還是可以使用[],只是速度沒有vector快)快速的訪問隨機的元素,快速的在開始和末尾插入元素,隨機的插入,刪除元素要慢,空間的重新分配要比vector快,重新分配空間后,原有的元素不需要拷貝。對deque的排序操作,可將deque先復制到vector,排序后在復制回deque。
list?(每個元素間用鏈表相連)訪問隨機元素不如vector快,隨機的插入元素比vector快,對每個元素分配空間,所以不存在空間不夠,重新分配的情況。
set:內部元素唯一,用一棵平衡樹結構來存儲,因此遍歷的時候就排序了,查找也比較快的哦。
map :一對一的映射的結合,key不能重復。
stack :適配器,必須結合其他的容器使用,stl中默認的內部容器是deque。先進后出,只有一個出口,不允許遍歷。
queue: 是受限制的deque,內部容器一般使用list較簡單。先進先出,不允許遍歷。
vector<bool> 與bitset<> ,前面的可以動態改變長度。
priority_queue: 插入的元素就有優先級順序,top出來的就是優先級最高的了
valarray 專門進行數值計算的,增加特殊的數學函數。
| ?s.empty() | ?如果棧為這人,則true;否則返回false |
| ?s.size() | ?返回棧中元素的個數 |
| ?s.pop() | ?刪除棧頂元素,但不返回其值 |
| ?s.top() | ?返回棧頂元素的值,但不刪除該元素 |
| ?s.push(item) | ?在棧項壓入新元素 |
| ?q.empty() | ?如果隊列為空,則返回true;否則返回false |
| ?q.size() | ?返回隊列中元素的個數 |
| ?q.pop() | ?刪除隊首元素,但不返回其值 |
| ?q.front() | ?返回隊首元素的值,但不刪除該元素 ?(注:該操作只適用于隊列) |
| ?q.back() | ?返回隊尾元素的值,但不刪除該元素 ?(注:該操作只適用于隊列) |
| ?q.top() | ?返回具有最高優先級的元素值,但不刪除該元素 |
| ?q.push(item) | ?對于queue,在隊尾壓入一個新元素; ?對于priority_queue,在基于優先級的適當位置插入新元素 |
總結
- 上一篇: 百度笔试题:malloc/free与ne
- 下一篇: 淘宝2011.9.21校园招聘会笔试题