C++中的容器類包括“順序存儲(chǔ)結(jié)構(gòu)”和“關(guān)聯(lián)存儲(chǔ)結(jié)構(gòu)”,前者包括vector,,list,,deque等;后者包括set,,map,,multiset,multimap等,。
若需要存儲(chǔ)的元素?cái)?shù)在編譯器間就可以確定,,可以使用數(shù)組來(lái)存儲(chǔ),否則,,就需要用到容器類了,。
1、vector
連續(xù)存儲(chǔ)結(jié)構(gòu),,每個(gè)元素是在內(nèi)存上是連續(xù)的,;
支持高效的隨機(jī)訪問(wèn)和在尾端插入/刪除操作,但其他位置的插入/刪除操作效率低下;
2,、deque
連續(xù)存儲(chǔ)結(jié)構(gòu),,即其每個(gè)元素在內(nèi)存上也是連續(xù)的,類似于vector,,不同之處在于,,deque提供了兩級(jí)數(shù)組結(jié)構(gòu),第一級(jí)完全類似于vector,,代表實(shí)際容器,;另一級(jí)維護(hù)容器的首位地址。
這樣,,deque除了具有vector的所有功能外,,還支持高效的首端插入/刪除操作。
3,、list
非連續(xù)存儲(chǔ)結(jié)構(gòu),,具有雙鏈表結(jié)構(gòu),每個(gè)元素維護(hù)一對(duì)前向和后向指針,,因此支持前向/后向遍歷。
支持高效的隨機(jī)插入/刪除操作,,但隨機(jī)訪問(wèn)效率低下,,且由于需要額外維護(hù)指針,開銷也比較大,。
4,、vector V.S. list V.S. deque:
a、若需要隨機(jī)訪問(wèn)操作,,則選擇vector,;
b、若已經(jīng)知道需要存儲(chǔ)元素的數(shù)目,, 則選擇vector,;
c、若需要隨機(jī)插入/刪除(不僅僅在兩端),,則選擇list
d,、只有需要在首端進(jìn)行插入/刪除操作的時(shí)候,才選擇deque,,否則都選擇vector,。
e、若既需要隨機(jī)插入/刪除,,又需要隨機(jī)訪問(wèn),,則需要在vector與list間做個(gè)折中。
f、當(dāng)要存儲(chǔ)的是大型負(fù)責(zé)類對(duì)象時(shí),,list要優(yōu)于vector,;當(dāng)然這時(shí)候也可以用vector來(lái)存儲(chǔ)指向?qū)ο蟮闹羔槪瑯訒?huì)取得較高的效率,,但是指針的維護(hù)非常容易出錯(cuò),,因此不推薦使用。
5,、capacity V.S size
a,、capacity是容器需要增長(zhǎng)之前,能夠盛的元素總數(shù),;只有連續(xù)存儲(chǔ)的容器才有capacity的概念(例如vector,,deque,string),,list不需要capacity,。
b、size是容器當(dāng)前存儲(chǔ)的元素的數(shù)目,。
c,、vector默認(rèn)的容量初始值,以及增長(zhǎng)規(guī)則是依賴于編譯器的,。
6,、用vector存儲(chǔ)自定義類對(duì)象時(shí),自定義類對(duì)象須滿足:
a,、有可供調(diào)用的無(wú)參構(gòu)造函數(shù)(默認(rèn)的或自定義的),;
b、有可用的拷貝賦值函數(shù)(默認(rèn)的或自定義的)
7,、迭代器iterator
a,、vector與deque的迭代器支持算術(shù)運(yùn)算,list的迭代器只能進(jìn)行++/--操作,,不支持普通的算術(shù)運(yùn)算,。
以下為整個(gè)列表概述:
標(biāo)準(zhǔn)容器類 |
說(shuō)明 |
順序性容器 |
vector |
從后面快速的插入與刪除,直接訪問(wèn)任何元素 |
deque |
從前面或后面快速的插入與刪除,,直接訪問(wèn)任何元素 |
list |
雙鏈表,,從任何地方快速插入與刪除 |
關(guān)聯(lián)容器 |
set |
快速查找,不允許重復(fù)值 |
multiset |
快速查找,,允許重復(fù)值 |
map |
一對(duì)多映射,,基于關(guān)鍵字快速查找,不允許重復(fù)值 |
multimap |
一對(duì)多映射,,基于關(guān)鍵字快速查找,,允許重復(fù)值 |
容器適配器 |
stack |
后進(jìn)先出 |
queue |
先進(jìn)先出 |
priority_queue |
最高優(yōu)先級(jí)元素總是第一個(gè)出列 |
所有標(biāo)準(zhǔn)庫(kù)共有函數(shù)
默認(rèn)構(gòu)造函數(shù) |
提供容器默認(rèn)初始化的構(gòu)造函數(shù),。 |
復(fù)制構(gòu)造函數(shù) |
將容器初始化為現(xiàn)有同類容器副本的構(gòu)造函數(shù) |
析構(gòu)函數(shù) |
不再需要容器時(shí)進(jìn)行內(nèi)存整理的析構(gòu)函數(shù) |
empty |
容器中沒(méi)有元素時(shí)返回true,否則返回false |
max_size |
返回容器中最大元素個(gè)數(shù) |
size |
返回容器中當(dāng)前元素個(gè)數(shù) |
operator= |
將一個(gè)容器賦給另一個(gè)容器 |
operator< |
如果第一個(gè)容器小于第二個(gè)容器,返回true,,否則返回false,, |
operator<= |
如果第一個(gè)容器小于或等于第二個(gè)容器,返回true,,否則返回false |
operator> |
如果第一個(gè)容器大于第二個(gè)容器,,返回true,否則返回false |
operator>= |
如果第一個(gè)容器大于或等于第二個(gè)容器,,返回true,,否則返回false |
operator== |
如果第一個(gè)容器等于第二個(gè)容器,返回true,,否則返回false |
operator!= |
如果第一個(gè)容器不等于第二個(gè)容器,,返回true,否則返回false |
swap |
交換兩個(gè)容器的元素 |
其中operator>,operator>=,operator<,operator<=,operator==,operator!=均不適用于priority_queue
順序容器和關(guān)聯(lián)容器共有函數(shù)
begin |
該函數(shù)兩個(gè)版本返回iterator或const_iterator,,引用容器第一個(gè)元素 |
end |
該函數(shù)兩個(gè)版本返回iterator或const_iterator,引用容器最后一個(gè)元素后面一位 |
rbegin |
該函數(shù)兩個(gè)版本返回reverse_iterator或const_reverse_iterator,引用容器最后一個(gè)元素 |
rend |
該函數(shù)兩個(gè)版本返回reverse_iterator或const_reverse_iterator,,引用容器第一個(gè)元素前面一位 |
erase |
從容器中清除一個(gè)或幾個(gè)元素 |
clear |
清除容器中所有元素 |
下表顯示了順序容器和關(guān)聯(lián)容器中常用的typedef,這些typedef常用于變量,、參數(shù)和函數(shù)返回值的一般性聲明,。
value_type |
容器中存放元素的類型 |
reference |
容器中存放元素類型的引用 |
const_reference |
容器中存放元素類型的常量引用,這種引用只能讀取容器中的元素和進(jìn)行const操作 |
pointer |
容器中存放元素類型的指針 |
iterator |
指向容器中存放元素類型的迭代器 |
const_iterator |
指向容器中存放元素類型的常量迭代器,,只能讀取容器中的元素 |
reverse_iterator |
指向容器中存放元素類型的逆向迭代器,,這種迭代器在容器中逆向迭代 |
const_reverse_iterator |
指向容器中存放元素類型的逆向迭代器,只能讀取容器中的元素 |
difference_type |
引用相同容器的兩個(gè)迭代器相減結(jié)果的類型(list和關(guān)聯(lián)容器沒(méi)有定義operator-) |
size_type |
用于計(jì)算容器中項(xiàng)目數(shù)和檢索順序容器的類型(不能對(duì)list檢索) |
三,、序列類容器
vector
向量 相當(dāng)于一個(gè)數(shù)組
在內(nèi)存中分配一塊連續(xù)的內(nèi)存空間進(jìn)行存儲(chǔ)。支持不指定vector大小的存儲(chǔ),。STL內(nèi)部實(shí)現(xiàn)時(shí),,首先分配一個(gè)非常大的內(nèi)存空間預(yù)備進(jìn)行存儲(chǔ),即capacituy()函數(shù)返回的大小,,當(dāng)超過(guò)此分配的空間時(shí)再整體重新放分配一塊內(nèi)存存儲(chǔ),,這給人以vector可以不指定vector即一個(gè)連續(xù)內(nèi)存的大小的感覺(jué)。通常此默認(rèn)的內(nèi)存分配能完成大部分情況下的存儲(chǔ),。
優(yōu)點(diǎn):(1) 不指定一塊內(nèi)存大小的數(shù)組的連續(xù)存儲(chǔ),,即可以像數(shù)組一樣操作,但可以對(duì)此數(shù)組
進(jìn)行動(dòng)態(tài)操作,。通常體現(xiàn)在push_back() pop_back()
(2) 隨機(jī)訪問(wèn)方便,,即支持[ ]操作符和vector.at()
(3) 節(jié)省空間。
缺點(diǎn):(1) 在內(nèi)部進(jìn)行插入刪除操作效率低,。
(2) 只能在vector的最后進(jìn)行push和pop,,不能在vector的頭進(jìn)行push和pop。
(3) 當(dāng)動(dòng)態(tài)添加的數(shù)據(jù)超過(guò)vector默認(rèn)分配的大小時(shí)要進(jìn)行整體的重新分配、拷貝與釋
放
2 list
雙向鏈表
每一個(gè)結(jié)點(diǎn)都包括一個(gè)信息快Info,、一個(gè)前驅(qū)指針Pre,、一個(gè)后驅(qū)指針Post??梢圆环峙浔仨毜膬?nèi)存大小方便的進(jìn)行添加和刪除操作,。使用的是非連續(xù)的內(nèi)存空間進(jìn)行存儲(chǔ)。
優(yōu)點(diǎn):(1) 不使用連續(xù)內(nèi)存完成動(dòng)態(tài)操作,。
(2) 在內(nèi)部方便的進(jìn)行插入和刪除操作
(3) 可在兩端進(jìn)行push,、pop
缺點(diǎn):(1) 不能進(jìn)行內(nèi)部的隨機(jī)訪問(wèn),即不支持[ ]操作符和vector.at()
(2) 相對(duì)于verctor占用內(nèi)存多
3 deque
雙端隊(duì)列 double-end queue
deque是在功能上合并了vector和list,。
優(yōu)點(diǎn):(1) 隨機(jī)訪問(wèn)方便,,即支持[ ]操作符和vector.at()
(2) 在內(nèi)部方便的進(jìn)行插入和刪除操作
(3) 可在兩端進(jìn)行push、pop
缺點(diǎn):(1) 占用內(nèi)存多
使用區(qū)別:
1 如果你需要高效的隨即存取,,而不在乎插入和刪除的效率,,使用vector
2 如果你需要大量的插入和刪除,而不關(guān)心隨即存取,,則應(yīng)使用list
3 如果你需要隨即存取,,而且關(guān)心兩端數(shù)據(jù)的插入和刪除,則應(yīng)使用deque