C 中支援隨機訪問的容器有哪些

時間 2022-09-07 09:56:55

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的迭代器只能進行++/--操作,不支援普通的算術運算。