一、六種序列容器
1、vector 向量
類似乙個陣列。區別在於:
動態儲存、記憶體耗用更大,因為stl內部實現時,首先分配乙個非常大的記憶體空間預備進行儲存,即capacituy()函式返回的大小,當超過此分配的空間時再整體重新放分配一塊記憶體儲存,這給人以vector可以不指定vector即乙個連續記憶體的大小的感覺。
優點: (1) 不指定一塊記憶體大小的陣列的連續儲存,即可以像陣列一樣操作,但可以對此陣列進行動態操作。通常體現在push_back() pop_back()
(2) 隨機訪問方便,即支援[ ]操作符和vector.at(),使用.at()操作當越界可丟擲異常
缺點:(1) 在內部進行插入刪除操作效率低。
(2) 只能在vector的最後進行push和pop(push_back,pop_back),不能在vector的頭進行push和pop。若想在vector頭插入,可使用insert(位置,值);
如:
vector::iterator it=v.begin();
v.insert(it,521)//插入值521將插在指定位置左邊
從vector前面刪除:
it=v.begin();
v.erase(it);//甚至可以用erase刪除指定區間的元素 //刪除後返回迭代器的指向下乙個元素
(3) 當動態新增的資料超過vector預設分配的大小時要進行整體的重新分配、拷貝與釋放,消耗記憶體、時間
2、 list
雙向鍊錶
每乙個結點都包括乙個資訊快info、乙個前驅指標pre、乙個後驅指標post。可以不分配必須的記憶體大小方便的進行新增和刪除操作。使用的是非連續的記憶體空間進行儲存。
優點:(1) 不使用連續記憶體完成動態操作。
(2) 在內部方便的進行插入和刪除操作(insert,erase)
(3) 可在兩端進行push、pop(push_back,pop_back、push_front、pop_front)
缺點:(1) 不能進行內部的隨機訪問,即不支援[ ]操作符和vector.at()
(2) 相對於verctor占用記憶體多
list沒有空間預留習慣,所以每分配乙個元素都會從記憶體中分配,每刪除乙個元素都會釋放它占用的記憶體。list在**新增刪除元素效能都很高,不需要移動記憶體,當然也不需要對每個元素都進行構造與析構了,所以常用來做隨機操作容器與vector不同是,當向容器中插入或刪除元素後,鍊錶迭代器指向元素將不變。 如果乙個vector有5個元素,中間插入乙個,那麼第五個元素包含的值將是以前第四個元素的值,因此,迭代器指向的位置不變,但是資料不同。然而,在鍊錶中插入新元素並不會移動已有的元素,而只是修改鏈結資訊。 指向某個元素的迭代器仍然指向該元素,也就是值相同,鏈結的位置不同了。
3、 deque
雙端佇列 double-end queue
deque是在功能上合併了vector和list,看起來像是list和vector的結合品。
優點:(1) 隨機訪問方便,即支援[ ]操作符和vector.at()
(2) 在內部方便的進行插入和刪除操作(insert,erase))
(3) 可在兩端進行push、pop(push_back,pop_back、push_front、pop_front)
缺點:(1) 占用記憶體多
在標準庫中vector和deque提供幾乎相同的介面,在結構上它們的區別主要在於這兩種容器在組織記憶體上不一樣,deque是按頁或塊來分配儲存器 的,每頁包含固定數目的元素.相反vector分配一段連續的記憶體,vector只是在序列的尾段插入元素時才有效率,而deque的分頁組織方式即使在 容器的前端也可以提供常數時間的insert和erase操作,而且在體積增長方面也比vector更具有效率。deque在開始和最後新增元素都一樣快,並提供了隨機訪問方法,像vector一樣使用訪問任意元素,但是隨機訪問速度比不上vector快,因為它要內部處理堆跳轉。
使用區別:
1 如果你需要高效的隨即訪問,而不在乎插入和刪除的效率,使用vector
2 如果你需要大量的插入和刪除,而不關心隨即訪問,則應使用list
3 如果你需要隨即訪問,而且關心兩端資料的插入和刪除,則應使用deque
4、 queue
queue是乙個介面卡類,底層類預設為deque。 它不允許隨機訪問佇列元素,甚至不允許遍歷佇列。可以將元素新增到隊尾,檢視隊尾和隊首的元素的值,檢查元素數目和測試佇列是否為空。
5、 priority_queue
與queue的不同是,最大的元素總是在隊首,也是乙個介面卡類,預設的底層類是vector。
可以修改用於確定哪個元素放在隊首的比較方式,方法是提供乙個可選的構造函式引數。
6、 stack
也是乙個介面卡類,預設的底層實現為vector。 不允許隨機訪問堆疊元素,甚至不允許遍歷堆疊。可以壓入到棧頂,從棧頂彈出元素,檢視棧頂元素的值,檢查元素數目和測試堆疊是否為空。
二. 4種聯合容器:set,multiset, map, multimap(這四種容器插入資料的時候都會自動排序)
聯合容器將值與關鍵字關聯在一起,使用關鍵字來查詢值。
關聯容器的長處在於,它提供了對元素的快速訪問。 與序列相似,聯合容器也允許插入新元素,不過不能指定元素的插入位置。原因是聯合容器通常包含用於確定資料存放位置的演算法,以便能夠很快檢索資訊。
1、 set,multiset
前兩種是在set標頭檔案中;
值的型別與關鍵字相同。 set刪除相同的元素,multiset不會。
multiset與vector的最直接的區別在於,multiset的插入的數會進行排序,並且multiset可以定義自己的排序規則!
2、 map,multimap
後兩種是在map標頭檔案中。
值的型別與關鍵字不同。 map關鍵字唯一,multimap關鍵字不唯一。
可使用multimap.cout(),來的到相同關鍵字的數量,再使用find來查詢第乙個的iterator;
這四種容器的例子:
#include#include#include#includeusing namespace std;
int main();
int b=;
sets(b,b+10);
multisetms(a,a+15);
multimapmm;
for(set::iterator iters=s.begin();iters!=s.end();++iters)
cout<::iterator iterm=ms.begin();iterm!=ms.end();++iterm)
cout<::iterator itersmap=mm.begin();itersmap!=mm.end();++itersmap)
return 0;
}
STL中的容器
一 什麼是stl stl是standart template library,標準模板庫 是hp實驗室開發的一系列軟體的統稱,從根本上說,它是一些容器和演算法的集合,它是世界上很多最聰明的程式設計師多年的傑作 stl是標準化的元件,不用重新開發,可以直接使用,它是c 的一部分,不需要額外安裝 二 s...
STL中的容器對比
容器內部各個元素的位置取決插入的方式,與元素本身無關 vector 動態陣列,連續儲存 使用於尾部刪除插入,不適用與中間刪除插入,訪問效率高 deque 雙端佇列,分片連續儲存 使用於頭尾插入刪除,中間插入刪除效率低,支援下標操作 list 雙向鍊錶 適用於在序列頻繁插入 刪除 不需要移動資料 且不...
C C 中的順序容器
乙個容器就是一些特定型別物件的集合。順序容器提供了控制元素儲存和訪問順序的能力。順序容器型別 選取順序容器的一些準則 與內建陣列相比,array是一種更安全,更容易使用的陣列型別,現代c 程式應該使用標準庫容器,而不是更原始的資料結構比如內建陣列 除非有很好的理由選擇其他容器,否則使用vector ...