初學者學用法可以參見:
http://www.cplusplus.com/reference/stl/
要了解各個容器的特點才能選擇適合的容器哦。
一、vector
Vectors are good at:
- Accessing individual elements by their position index (constant time).
- Iterating over the elements in any order (linear time).
- Add and remove elements from its end (constant amortized time).
支持快速的隨機訪問。(可以用迭代器或下標直接訪問)
在尾部插入和刪除元素速度快。
看到這些性質當然想到的是靜態數組了,不過和靜態數組不同的是,vector申請的內存比數組要稍微大一點,以便之後擴展用。
二、list
This provides the following advantages tolist containers:
- Efficient insertion and removal of elements anywhere in the container (constant time).
- Efficient moving elements and block of elements within the container or even between different containers (constant time).
- Iterating over the elements in forward or reverse order (linear time).
支持在任何位置的快速插入和刪除操作。因此適合用於排序算法。(只能用迭代器訪問)
因爲list是雙向鏈表。
三、deque
雙端隊列
Deque sequences have the following properties:
- Individual elements can be accessed by their position index.
- Iteration over the elements can be performed in any order.
- Elements can be efficiently added and removed from any of its ends (either the beginning or the end of the sequence).
支持兩端的快速插入和刪除操作。
容器選擇:
1.如果要求隨機訪問元素,選擇vector或deque
2.如果要求在中間插入或刪除元素,選擇list
3.如果要求在首尾插入或刪除元素,選擇deque
4.混合:如果要求在中間插入元素,然後要求隨機訪問。可以選擇先用list,重新排序之後,使其適合順序訪問,再放入vector或deque中去。
注:一般情況下vector都是最好的選擇。
順序容器的適配器:
一、stack
back() push_back()pop_back()
二、queue
front() back() push_back()pop_front()
三、priority_queue
front() push_back()pop_back()
和順序容器不同的是,關聯容器有key的概念。
一、set
key的集合,可以和pair一同使用,也可以只表示有或沒有這個key在集合裏的意思。
輸出的時候總是從low到high輸出。
二、map
key-value的集合,用作字典。
可以使用下標訪問,即key找value。
三、multimap
之前key-value是一一對應的,這種容器支持一個key對應多個value。
四、multiset
允許key不唯一。
這個人博客裏寫的更加清晰,比我講的清楚
reference:
http://www.cnblogs.com/enterBeijingThreetimes/archive/2009/03/15/1412421.html
stl提供了三個最基本的容器:vector,list,deque。
vector和built-in數組類似,它擁有一段連續的內存空間,並且起始地址不變,因此它能非常好的支持隨即存取,即[]操作符,但由於它的內存空間是連續的,所以在中間進行插入和刪除會造成內存塊的拷貝,另外,當該數組後的內存空間不夠時,需要重新申請一塊足夠大的內存並進行內存的拷貝。這些都大大影響了vector的效率。
list就是數據結構中的雙向鏈表(根據sgi stl源代碼),因此它的內存空間可以是不連續的,通過指針來進行數據的訪問,這個特點使得它的隨即存取變的非常沒有效率,因此它沒有提供[]操作符的重載。但由於鏈表的特點,它可以以很好的效率支持任意地方的刪除和插入。
deque是一個double-ended queue,它的具體實現不太清楚,但知道它具有以下兩個特點:
它支持[]操作符,也就是支持隨即存取,並且和vector的效率相差無幾,它支持在兩端的操作:push_back,push_front,pop_back,pop_front等,並且在兩端操作上與list的效率也差不多。
因此在實際使用時,如何選擇這三個容器中哪一個,應根據你的需要而定,一般應遵循下面
的原則:
1、如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
2、如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list
3、如果你需要隨即存取,而且關心兩端數據的插入和刪除,則應使用deque。
vector爲存儲的對象分配一塊連續的地址空間,因此對vector中的元素隨機訪問效率很高。在vecotor中插入或者刪除某個元素,需要將現有元素進行復制,移動。如果vector中存儲的對象很大,或者構造函數複雜,則在對現有元素進行拷貝時開銷較大,因爲拷貝對象要調用拷貝構造函數。對於簡單的小對象,vector的效率優於list。vector在每次擴張容量的時候,將容量擴展2倍,這樣對於小對象來說,效率是很高的。
list中的對象是離散存儲的,隨機訪問某個元素需要遍歷list。在list中插入元素,尤其是在首尾插入元素,效率很高,只需要改變元素的指針。
綜上所述:
vector適用:對象數量變化少,簡單對象,隨機訪問元素頻繁
list適用:對象數量變化大,對象複雜,插入和刪除頻繁