STL各種容器的區別

2021-06-01 11:29:07 字數 3019 閱讀 2187

容器名名稱

資料結構

效能備註

string

通用字串庫

連續存放的記憶體塊、

有保留記憶體

堆中分配記憶體

高效率的隨機訪問;

o(1)的訪問時間;

在最後增加元素時,一般不需要分配記憶體空間,速度快;

在中間或開始操作元素時要進行記憶體拷貝效率低;

支援操作;

vector

通用向量(陣列)庫

變長一維陣列;

連續存放的記憶體塊;

有保留記憶體;

堆中分配記憶體;

高效率的隨機訪問;

o(1)的訪問時間

在最後增加元素時,一般不需要分配記憶體空間,速度快;

在中間或開始操作元素時要進行記憶體拷貝效率低;

支援操作;

需要高效的隨即訪問,而不在乎插入和刪除使用vector

list

通用鍊錶庫

雙向鍊錶;

記憶體空間上可能是不連續;

無保留記憶體

堆中分配記憶體;

隨機儲存需要遍歷指標所以效率低;

很高的效率進行任意地方刪除插入;

開始和結尾元素的訪問時間快,其它元素都o(n);

大量的插入和刪除,而不關係隨即訪問使用list

deque

雙端佇列;

在堆上分配記憶體;

個堆儲存幾個元素,而堆之間使用指標連線;

支援操作;

像是list和vector的結合;

關心插入和刪除並關心隨即訪問折中使用deque

set通用集合庫

集合;無序的儲存元素

map通用字典庫

平衡二叉樹;

乙個值對映成另乙個值

查詢某一值是常數時間o(1);

每次插入值的時候,會重新構成底層的平衡二叉樹,效率有一定影響

建立字典時使用

在stl中基本容器有:string、vector、list、deque、set、map

set和map都是無序的儲存元素,只能通過它提供的介面對裡面的元素進行訪問

set:集合,用來判斷某乙個元素是不是在乙個組裡面,一般此容器使用的比較少。

map:對映,相當於字典,把乙個值對映成另乙個值,如果想建立字典的話使用它是最好的,底層採用的是樹型結構,多數使用平衡二叉樹實現,查詢某一值是常數時間,遍歷起來效果也不錯,只是每次插入值的時候,會重新構成底層的平衡二叉樹,效率有一定影響。

string、vector、list、deque、set是有序容器; 

1.  string

名為:通用字串庫

string是乙個處理字串資料的類,支援變長字串,支援隨機訪問

string是basic_string實現,在記憶體中是連續存放的,為了提高效率,都會有保留記憶體,會在一開始分配乙個大於內容的記憶體,當內容增加時不用再分配新的記憶體,只有當已分記憶體放不下時。再分配新的記憶體空間。

對string的操作,如果是新增到最後時,一般不需要分配新的記憶體,所以效能最快;

如果對中間或是開始部分操作,如往那裡新增元素或是刪除元素,或是代替元素,這時需要進行記憶體複製,效能會降低。

當刪除元素時,並不會立刻釋放它已經分配的記憶體,為了是下次使用時可以高效。

由於保留記憶體,所以大量使用時會有記憶體浪費。

在堆中分配記憶體;

2. vector

名為:通用向量(陣列)庫

std:vector, 是乙個變長一維陣列模板類,同內建陣列一樣,支援隨機訪問。、

實際上就是乙個動態陣列,隨機訪問任何元素都能在常數時間完成,在尾端增刪元素具有較佳的效能。

元素連續存放,同樣有保留記憶體,如果減少大小後記憶體不會釋放,當新值大於當前記憶體大小時才會再分配記憶體;

其擁有一段連續記憶體,並且起始位址始終不變,因此能非常好的支援隨即訪問,即陣列的操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷貝,另外,當該陣列後的記憶體空間不夠時需要重新申請一塊足夠大的記憶體進行記憶體拷貝,大大影響了效率。

同string一樣,對最後元素的操作是最快的,此時一般不需要移動記憶體,只有保留記憶體不夠時才需要分配記憶體進行記憶體拷貝。

對中間和開始處進行新增刪除元素操作需要移動記憶體。如果元素是結構和類,那移動的同時還會進行構造和析構操作,所以效能不高(此時以儲存類對像的指標為好);

訪問方面,由於是連續記憶體的儲存。所以對任何元素的訪問都是o(1),即常數時間完成。

同string一樣可以使用capacity看當前保留的記憶體,使用swap來減少它使用的記憶體。

同樣在堆上分配記憶體;

隨機訪問效率很高

3. 名為:通用鍊錶庫

list是乙個通用的雙向鍊錶模板類,支援任意位置的資料讀寫,插入和刪除操作。

對list的訪問主要通過迭代器實現。

由於是鍊錶儲存所以記憶體空間上可以是不連續的,通過指標進行資料的訪問,隨機儲存需要遍歷指標所以效率很低。但鍊錶的特點,它可以很高的效率進行任意地方的刪除和插入。

沒有記憶體空間預留,所以每次增加元素都會從記憶體中分配空間,每次刪除都會釋放它占用的記憶體。

因為使用鍊錶儲存指標的方式,所以新增刪除元素時不存在記憶體拷貝的問題,也沒有對每類對像元素進行構造析構的問題,所以常作隨機操作容器。

但就訪問來說。因為雙向鍊錶,只有開始和結尾元素的訪問時間快。其它元素都o(n)

元素在堆上分配;

如果新增刪除大記憶體元素用list比較好。對於list《指標》是效能最低下的做法;

54 deque

deque是乙個雙端佇列,是乙個個的堆。每個堆儲存幾個元素,而堆之間使用指標連線,像是list和vector的結合,支援操作,也支援隨機訪問,可以有較高的隨機訪問速度。

在堆上分配記憶體;

5. 名為:通用集合庫

set或multiset是乙個按使用者指定排序規則將set內的資料進行排序的集合庫,set內不允許有相同的資料,而multiset允許有重複資料。

6.名為:通用字典庫

map或multimap是乙個字典模板類,其索引可以是任意使用者指定型別。且能按使用者指定排序規則將map內的資料進行排序的集合庫,map內不允許有相同的資料,而multimap允許有重複資料。

STL 各種容器

c stl 的實現 1.vector 底層資料結構為陣列 支援快速隨機訪問 2.list 底層資料結構為雙向鍊錶,支援快速增刪 3.deque 底層資料結構為乙個 控制器和多個緩衝區,詳細見stl原始碼剖析p146,支援首尾 中間不能 快速增刪,也支援隨機訪問 4.stack 底層一般用23實現,封...

STL中各種容器效率

2.deque 動態陣列 deque支援隨機訪問。在deque的首端和末端插入和刪除元素比較快,在中部插入和刪除則比較慢。deque的記憶體重分配效能比vector好。3.list 雙向鍊錶 list不支援隨機訪問。list在任何位置安插和刪除元素速度都比較快 雙向鍊錶 list的安插和刪除操作不會...

STL裡的容器區別

小結 我們常用到的stl容器有vector list deque map multimap set和multiset,它們究竟有何區別,各自的優缺點是什麼,為了更好的揚長避短,提高程式效能,在使用之前需要我們了解清楚。verctor vector類似於c語言中的陣列,它維護一段連續的記憶體空間,具有...