關於C 中的容器

2021-08-17 04:17:49 字數 4476 閱讀 8561

關於c++中的容器

c++中的容器類包括「順序儲存結構」和「關聯儲存結構」,前者包括vector,list,deque等;後者包括set,map,multiset,multimap等。若需要儲存的元素數在編譯器間就可以確定,可以使用陣列來儲存,否則,就需要用到容器類了。

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

以下為整個列表概述:

標準容器類

說明順序性容器

vector

從後面快速的插入與刪除,直接訪問任何元素

deque

從前面或後面快速的插入與刪除,直接訪問任何元素

list

雙鏈表,從任何地方快速插入與刪除

關聯容器

set快速查詢,不允許重複值

multiset

快速查詢,允許重複值

map一對多對映,基於關鍵字快速查詢,不允許重複值

multimap

一對多對映,基於關鍵字快速查詢,允許重複值

容器介面卡

stack

後進先出

queue

先進先出

priority_queue

最高優先順序元素總是第乙個出列

所有標準庫共有函式

預設建構函式

提供容器預設初始化的建構函式。

複製建構函式

將容器初始化為現有同類容器副本的建構函式

析構函式

不再需要容器時進行記憶體整理的析構函式

empty

容器中沒有元素時返回true,否則返回false

max_size

返回容器中最大元素個數

size

返回容器中當前元素個數

operator=

將乙個容器賦給另乙個容器

operator<

如果第乙個容器小於第二個容器,返回true,否則返回false,

operator<=

如果第乙個容器小於或等於第二個容器,返回true,否則返回false

operator>

如果第乙個容器大於第二個容器,返回true,否則返回false

operator>=

如果第乙個容器大於或等於第二個容器,返回true,否則返回false

operator==

如果第乙個容器等於第二個容器,返回true,否則返回false

operator!=

如果第乙個容器不等於第二個容器,返回true,否則返回false

swap

交換兩個容器的元素

其中operator>,operator>=,operator<,operator<=,operator==,operator!=均不適用於priority_queue

順序容器和關聯容器共有函式

begin

該函式兩個版本返回iterator或const_iterator,引用容器第乙個元素

end該函式兩個版本返回iterator或const_iterator,引用容器最後乙個元素後面一位

rbegin

該函式兩個版本返回reverse_iterator或const_reverse_iterator,引用容器最後乙個元素

rend

該函式兩個版本返回reverse_iterator或const_reverse_iterator,引用容器第乙個元素前面一位

erase

從容器中清除乙個或幾個元素

clear

清除容器中所有元素

下表顯示了順序容器和關聯容器中常用的typedef,這些typedef常用於變數、引數和函式返回值的一般性宣告。

value_type

容器中存放元素的型別

reference

容器中存放元素型別的引用

const_reference

容器中存放元素型別的常量引用,這種引用只能讀取容器中的元素和進行const操作

pointer

容器中存放元素型別的指標

iterator

指向容器中存放元素型別的迭代器

const_iterator

指向容器中存放元素型別的常量迭代器,只能讀取容器中的元素

reverse_iterator

指向容器中存放元素型別的逆向迭代器,這種迭代器在容器中逆向迭代

const_reverse_iterator

指向容器中存放元素型別的逆向迭代器,只能讀取容器中的元素

difference_type

引用相同容器的兩個迭代器相減結果的型別(list和關聯容器沒有定義operator-)

size_type

用於計算容器中專案數和檢索順序容器的型別(不能對list檢索)

8.序列類容器

(1)vector向量相當於乙個陣列

在記憶體中分配一塊連續的記憶體空間進行儲存。支援不指定vector大小的儲存。stl內部實現時,首先分配乙個非常大的記憶體空間預備進行儲存,即capacity()函式返回的大小,當超過此分配的空間時再整體重新放分配一塊記憶體儲存,這給人以vector可以不指定vector即乙個連續記憶體的大小的感覺。通常此預設的記憶體分配能完成大部分情況下的儲存。

優點:(1) 不指定一塊記憶體大小的陣列的連續儲存,即可以像陣列一樣操作,但可以對此陣列進行動態操作。通常體現在push_back() pop_back()

(2) 隨機訪問方便,即支援[ ]操作符和vector.at()

(3) 節省空間。

缺點:(1) 在內部進行插入刪除操作效率低。

(2) 只能在vector的最後進行push和pop,不能在vector的頭進行push和pop。

(3) 當動態新增的資料超過vector預設分配的大小時要進行整體的重新分配、拷貝與釋放

(2)list 雙向鍊錶

每乙個結點都包括乙個資訊快info、乙個前驅指標pre、乙個後驅指標post。可以不分配必須的記憶體大小方便的進行新增和刪除操作。使用的是非連續的記憶體空間進行儲存。

優點:(1) 不使用連續記憶體完成動態操作。

(2) 在內部方便的進行插入和刪除操作

(3) 可在兩端進行push、pop

缺點:(1) 不能進行內部的隨機訪問,即不支援[ ]操作符和vector.at()

(2) 相對於verctor占用記憶體多

(3) deque   雙端佇列 double-end queue

deque是在功能上合併了vector和list。

優點:(1) 隨機訪問方便,即支援[ ]操作符和vector.at()

(2) 在內部方便的進行插入和刪除操作

(3) 可在兩端進行push、pop

缺點:(1) 占用記憶體多

使用區別:

1)如果你需要高效的隨即訪問,而不在乎插入和刪除的效率,使用vector

2)如果你需要大量的插入和刪除,而不關心隨機訪問,則應使用list

3)如果你需要隨機訪問,而且關心兩端資料的插入和刪除,則應使用deque

關於C 中的順序容器

本文參考了 1 順序容器包括 vector,list,deque 2 接受容器大小做形參的建構函式只適用於順序容器,而關聯容器不支援這種初始化。3 作為容器元素型別必須滿足以下兩個約束 一 元素型別必須支援賦值運算。二 元素型別的物件必須可以複製。上面的兩條是最低限度的元素型別約束。除了引用型別外,...

關於vb中的容器

最失敗的事情莫過於,用了十來年的vb,忽然發現,原來自己還沒有搞懂一些最簡單的東西.昨天,第一次試用了一下vb的類的繼承,感覺還不賴。今天,開始琢磨一下很久以來一直困擾我的乙個問題,就是在vb中找乙個比較好的的容器。其實我的要求很低,想c 中的arraylist就行了,能夠靈活的加入,能夠遍歷,即可...

c 關於 queue 容器

queue 翻譯為佇列,是 stl 中實現的乙個 先進先出的容器 要使用 queue 必須新增 queue 標頭檔案,即 include 同時必須要有 using namespace std queuename 其中,typename 可以是任何基本型別或容器,name為佇列的名字。empty 用於...