C C 中STL的容器

2021-06-25 14:45:08 字數 3370 閱讀 5464

一、六種序列容器

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 ...