1樓:夜草小店與你分享世界
stl容器包含順序容器和關聯容器。關聯容器主要有vector,list,deque,關聯容器主要是pair、set、map、multiset和multimap,所以總共算是7種。
所謂隨機訪問,我的理解是按照陣列的方式在記憶體中順序存放,只需要根據首位址和相應下標就能定址到相應的元素。
所以逐個分析如下:
vector的實現原理是陣列,所以支援隨機訪問。
list的實現原理是雙向鍊錶,所以不支援。
deque的實現原理是類似陣列的雙端佇列,支援隨機訪問。
pair是個二元組,一共就兩個值,談不上隨機訪問。
set、multiset、map、multimap的實現原理是紅黑樹,不支援隨機訪問。
所以在上述七種容器中只有vector和deque兩種是支援隨機訪問的。
2樓:
1、vector
連續儲存結構,每個元素在記憶體上是連續的;
支援高效的隨機訪問和在尾端插入/刪除操作,但其他位置的插入/刪除操作效率低下;
2、deque
連續儲存結構,即其每個元素在記憶體上也是連續的,類似於vector,不同之處在於,deque提供了兩級陣列結構,第一級完全類似於vector,代表實際容器;另一級維護容器的首位位址。
這樣,deque除了具有vector的所有功能外,還支援高效的首端插入/刪除操作。
3、list
非連續儲存結構,具有雙鏈表結構,每個元素維護一對前向和後向指標,因此支援前向/後向遍歷。
支援高效的隨機插入/刪除操作,但隨機訪問效率低下,且由於需要額外維護指標,開銷也比較大。
4、vector v.s. list v.s. deque:
a、若需要隨機訪問操作,則選擇vector;
b、若已經知道需要儲存元素的數目, 則選擇vector;
c、若需要隨機插入/刪除(不僅僅在兩端),則選擇list
d、只有需要在首端進行插入/刪除操作的時候,才選擇deque,否則都選擇vector。
e、若既需要隨機插入/刪除,又需要隨機訪問,則需要在vector與list間做個折中。
f、當要儲存的是大型負責類物件時,list要優於vector;當然這時候也可以用vector來儲存指向物件的指標,同樣會取得較高的效率,但是指標的維護非常容易出錯,因此不推薦使用。
5、capacity v.s size
a、capacity是容器需要增長之前,能夠盛的元素總數;只有連續儲存的容器才有capacity的概念(例如vector,deque,string),list不需要capacity。
b、size是容器當前儲存的元素的數目。
c、vector預設的容量初始值,以及增長規則是依賴於編譯器的。
6、用vector儲存自定義類物件時,自定義類物件須滿足:
a、有可供呼叫的無參建構函式(預設的或自定義的);
b、有可用的拷貝賦值函式(預設的或自定義的)
7、迭代器iterator
a、vector與deque的迭代器支援算術運算,list的迭代器只能進行++/--操作,不支援普通的算術運算。