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檢索)
三、序列類容器
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預設分配的大小時要進行整體的重新分配、拷貝與釋
放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 容器對比
型別 vector list deque maphash map set簡介 vector是c 標準模板庫中的部分內容,它是乙個多功能的,能夠操作多種資料結構和演算法的模板類和函式庫。vector之所以被認為是乙個容器,是因為它能夠像容器一樣存放各種型別的物件,簡單地說vector是乙個能夠存放任意...
C 標準容器
1.c 中的容器類包括 順序儲存結構 和 關聯儲存結構 順序儲存結構 包括 vector list deque等 關聯儲存結構 包括 set,map,multiset multimap等。若需要儲存的元素數在編譯器間就可以確定,可以使用陣列來儲存,否則,就需要用到容器類了。2.各種用法 如果經常需要...
C 標準容器
c 裡的容器很多,但可以按照不同的標準進行分類,常見的一種分類是依據元素的訪問方式,分成順序容器 有序容器和無序容器三大類別。容器就是對資料結構的抽象和封裝,即能夠 容納 存放 元素的一些資料結構。c 標準庫里的容器幫助我們實現了最基本和最經典的資料結構,且容器的效能和優化水平已經非常完善,這一塊不...