標準庫中的容器分爲順序容器和關聯容器。順序容器(sequential container)內的元素按其位置存儲和訪問,顧名思義,這些內部元素是順序存放的;順序容器內的元素排列次序與元素值無關,而是由元素添加到容器裏的次序決定。而關聯容器的元素按鍵(key)排序。
標準容器類 | 說明 |
順序性容器 | |
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,在基於優先級的適當位置插入新元素 |