STL 容器類型

原文:http://blog.csdn.net/heyutao007/article/details/6905589

1. STL有6種序列容器類型


1 vector
向量 相當於一個數組
在內存中分配一塊連續的內存空間進行存儲。支持不指定vector大小的存儲。STL內部實現時,首先分配一個非常大的內存空間預備進行存儲,即capacituy()函數返回的大小,當超過此分配的空間時再整體重新放分配一塊內存存儲,這給人以vector可以不指定vector即一個連續內存的大小的感覺。通常此默認的內存分配能完成大部分情況下的存儲。
優點:(1) 不指定一塊內存大小的數組的連續存儲,即可以像數組一樣操作,但可以對此數組
進行動態操作。通常體現在push_back() pop_back()
(2) 隨機訪問方便,即支持[ ]操作符和vector.at()
(3) 節省空間。
缺點:(1) 在內部進行插入刪除操作效率低。
(2) 只能在vector的最後進行push和pop,不能在vector的頭進行push和pop。
(3) 當動態添加的數據超過vector默認分配的大小時要進行整體的重新分配、拷貝與釋放

push_back Add element at the end (public member function)
pop_back Delete last element (public member function)
insert Insert elements (public member function)
erase Erase elements (public member function )

清空
clear();
注意,clear()和resize()都不一定使得vector變小,若欲釋放內存,請使用vecobj.swap(vector<T, A>())

2 list
雙向鏈表
每一個結點都包括一個信息快Info、一個前驅指針Pre、一個後驅指針Post。可以不分配必須的內存大小方便的進行添加和刪除操作。使用的是非連續的內存空間進行存儲。
優點:(1) 不使用連續內存完成動態操作。
(2) 在內部方便的進行插入和刪除操作
(3) 可在兩端進行push、pop
缺點:(1) 不能進行內部的隨機訪問,即不支持[ ]操作符和vector.at()
(2) 相對於verctor佔用內存多

push_front Insert element at beginning (public member function)
pop_front Delete first element (public member function)
push_back Add element at the end (public member function)
pop_back Delete last element (public member function)
insert Insert elements (public member function)
erase Erase elements (public member function)

list沒有空間預留習慣,所以每分配一個元素都會從內存中分配,每刪除一個元素都會釋放它佔用的內存。list在哪裏添加刪除元素性能都很高,不需要移動內存,當然也不需要對每個元素都進行構造與析構了,所以常用來做隨機操作容器與vector不同是,當向容器中插入或刪除元素後,鏈表迭代器指向元素將不變。 如果一個vector有5個元素,中間插入一個,那麼第五個元素包含的值將是以前第四個元素的值,因此,迭代器指向的位置不變,但是數據不同。然而,在鏈表中插入新元素並不會移動已有的元素,而只是修改鏈接信息。 指向某個元素的迭代器仍然指向該元素,也就是值相同,鏈接的位置不同了。

3 deque
雙端隊列 double-end queue
deque是在功能上合併了vector和list,看起來像是list和vector的結合品。
優點:(1) 隨機訪問方便,即支持[ ]操作符和vector.at()
(2) 在內部方便的進行插入和刪除操作
(3) 可在兩端進行push、pop
缺點:(1) 佔用內存多

push_back Add element at the end (public member function)
push_front Insert element at beginning (public member function)
pop_back Delete last element (public member function)
pop_front Delete first element (public member function)
insert Insert elements (public member function)
erase Erase elements (public member function)

在標準庫中vector和deque提供幾乎相同的接口,在結構上它們的區別主要在於這兩種容器在組織內存上不一樣,deque是按頁或塊來分配存儲器 的,每頁包含固定數目的元素.相反vector分配一段連續的內存,vector只是在序列的尾段插入元素時纔有效率,而deque的分頁組織方式即使在 容器的前端也可以提供常數時間的insert和erase操作,而且在體積增長方面也比vector更具有效率。deque在開始和最後添加元素都一樣快,並提供了隨機訪問方法,像vector一樣使用[]訪問任意元素,但是隨機訪問速度比不上vector快,因爲它要內部處理堆跳轉。

使用區別:
1 如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
2 如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list

3 如果你需要隨即存取,而且關心兩端數據的插入和刪除,則應使用deque



4 queue
queue是一個適配器類,底層類默認爲deque。 它不允許隨機訪問隊列元素,甚至不允許遍歷隊列。可以將元素添加到隊尾,查看隊尾和隊首的元素的值,檢查元素數目和測試隊列是否爲空。

5 priority_queue
與queue的不同是,最大的元素總是在隊首,也是一個適配器類,默認的底層類是vector。
可以修改用於確定哪個元素放在隊首的比較方式,方法是提供一個可選的構造函數參數。

6 stack
也是一個適配器類,默認的底層實現爲vector。 不允許隨機訪問堆棧元素,甚至不允許遍歷堆棧。可以壓入到棧頂,從棧頂彈出元素,查看棧頂元素的值,檢查元素數目和測試堆棧是否爲空。


2. STL有4種聯合容器:set,multiset, map, multimap

聯合容器將值與關鍵字關聯在一起,使用關鍵字來查找值。
關聯容器的長處在於,它提供了對元素的快速訪問。 與序列相似,聯合容器也允許插入新元素,不過不能指定元素的插入位置。原因是聯合容器通常包含用於確定數據存放位置的算法,以便能夠很快檢索信息。

1 set,multiset
前兩種是在set頭文件中(以前分別爲set.h和multiset.h);

值的類型與關鍵字相同。 set刪除相同的元素,multiset不會。
2 map,multimap
後兩種是在map頭文件中(以前分別爲map.h和multimap.h)。
值的類型與關鍵字不同。 map關鍵字唯一,multimap關鍵字不唯一。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章