STL容器

 初學者學用法可以參見:

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適用:對象數量變化大,對象複雜,插入和刪除頻繁

 

發佈了86 篇原創文章 · 獲贊 7 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章