選用哪種容器,需要考慮的問題無非是兩點:容器的特點和我們需要對資料進行如何操作。
下面先簡要介紹一下vector、list和deque三種容器的特點:
vector容器相當於陣列,但是不需要定義它的大小。vector有乙個重要的特徵,就是:它裡面的資料時連續儲存的!理解了這一點,就不難理解vector的兩個重要的特點:支援快速的隨機訪問和隨機插入或者刪除元素時效率低下。因為是連續儲存的,所以當我們想要訪問其中的任意乙個元素時,只需要提供這個元素與第乙個元素的偏移量就可以了。為什麼說插入或者刪除效率低下呢?因為如果你插入(或者刪除)乙個元素,那麼他後面的所有元素都需要重新移動自己的位置。因此,vector定義了push_back操作來支援在容器的尾部插入元素,這個操作效率比較高,因為這樣做並沒有移動其他的元素。但這又存在乙個潛在的問題,就是vector在定義的時候,是不知道你要往它裡面push_back多少個元素的,怎麼給它分配合適的記憶體大小呢?對於每乙個每乙個vector,它其中有多少元素,那麼它的size()操作就返回多少;但是vector還有capacity()操作,來返回這個容器的容量,就是最大能插入多少個元素。容器已經滿了,即size = capacity,那麼再給vector新增元素時,不得不重新開闢一段空間,並把原來的值複製過去了。
我們看一段程式:
#include #include using namespace std;
int main()
{ vectorivec;
for(int i = 1; i != 11; ++i)
{ ivec.push_back(i);
cout<<"size = "<
從程式總可以看出,新的空間的大小等於原空間大小的1.5倍(19 = 13+13/2)
再看list。list相當於鍊錶。每乙個節點都有前驅指標,後繼指標以及資料元素組成。它依靠指標把整個結構串聯起來,不需要順序儲存。也正是因為整個原因,它的隨機訪問效能非常不好,要想訪問某乙個特定的元素,必須從頭開始,沿著指標依次訪問這個元素前面的每乙個元素,直到找到它為止。但是使用指標意味著可以高效能的插入或者刪除鍊錶中的任意乙個元素:只用改變指標的指向就可以了。
deque相當於二者的結合,使用多個連續的儲存塊。這意味它支援隨機訪問,但是效果沒有vector好,也支援在內部插入或者刪除元素,但效能不及list。deque支援高效地在頭部插入。
通常而言,當我們需要隨機訪問和在尾部插入時時,考慮vector,需要隨機插入或者刪除時,考慮list,如果需要在兩頭插入或者刪除,則考慮deque。
筆記 各種容器的特點
stl中基本容器有 string vector list deque set map set和map是無序的儲存元素 關聯容器 只能通過它提供的介面訪問元素。set 集合。用來判斷某個元素是否在乙個組裡。map 地圖。把乙個值對映成另乙個值。查詢 遍歷效果不錯。因為底層多用平衡二叉樹實現,所以插入時...
AS3 四種容器
經過這一段時間學習,也有了自己的一些新的學習理念。學習應該是乙個一點到面的過程,急也沒有用 穩步前進,比如網頁前端開發,就應該從邏輯層 開始入手,逐步學習到內部引擎,並且掌握好as3的語言特性而不僅僅是語法。下面就是我對as3中vector,array,object,dictionary四大容器的理...
C 各種容器特點總結 容器的選擇問題
1 vector 內部資料結構 陣列。隨機訪問每個元素,所需要的時間為常量。在末尾增加或刪除元素所需時間與元素數目無關,在中間或開頭增加或刪除元素所需時間隨元素數目呈線性變化。可動態增加或減少元素,記憶體管理自動完成,但程式設計師可以使用reserve 成員函式來管理記憶體。vector的迭代器在記...