C++ 標準模板庫
容器名 |
名稱 |
資料結構 |
效能 |
備忘 |
string |
string 通用字串庫 |
連續存放的記憶體塊、 有保留記憶體 堆中分配記憶體 |
高效率的隨機訪問; O(1)的訪問時間; 在最後增加元素時,一般不需要分配記憶體空間,速度快; 在中間或開始操作元素時要進行記憶體拷貝效率低; 支援[]操作; |
|
Vector |
vector 通用向量(數組)庫 |
變長一維數組; 連續存放的記憶體塊; 有保留記憶體; 堆中分配記憶體; |
高效率的隨機訪問; O(1)的訪問時間 在最後增加元素時,一般不需要分配記憶體空間,速度快; 在中間或開始操作元素時要進行記憶體拷貝效率低; 支援[]操作; |
需要高效的隨即存取,而不在乎插入和刪除使用vector |
list |
deque 通用鏈表庫 |
雙向鏈表; 記憶體空間上可能是不連續; 無保留記憶體 堆中分配記憶體; |
隨機儲存需要遍曆指標所以效率低; 很高的效率進行任意地方刪除插入; 開始和結尾元素的訪問時間快,其它元素都O(n); |
大量的插入和刪除,而不關係隨即存取使用list |
deque |
deque |
雙端隊列; 在堆上分配記憶體; 個堆儲存幾個元素,而堆之間使用指標串連; |
支援[]操作; 像是list和vector的結合; |
關心插入和刪除並關心隨即存取折中使用deque |
set |
set 通用集合庫 |
集合; 無序的儲存元素 |
|
|
Map |
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<char>實現,在記憶體中是連續存放的,為了提高效率,都會有保留記憶體,會在一開始分配一個大小於內容的記憶體,當內容增加時不用再分配新的記憶體,只有當已分記憶體放不下時。再分配新的記憶體空間。
對string的操作,如果是添加到最後時,一般不需要分配新的記憶體,所以效能最快;
如果對中間或是開始部分操作,如往那裡添加元素或是刪除元素,或是代替元素,這時需要進行記憶體複製,效能會降低。
當刪除元素時,並不會立刻釋放它已經分配的記憶體,為了是下次使用時可以高效。
由於保留記憶體,所以大量使用時會有記憶體浪費。
在堆中分配記憶體;
2. vector
名為:通用向量(數組)庫
Std:vector,
是一個變長一維數組模板類,同內建數組一樣,支援隨機存取。、
實際上就是一個動態數組,隨機存取任何元素都能在常數時間完成,在尾端增刪元素具有較佳的效能。
元素連續存放,同樣有保留記憶體,如果減少大小後記憶體不會釋放,當新值大於當前記憶體大小時才會再分配記憶體;
其擁有一段連續記憶體,並且起始地址始終不變,因此能非常好的支援隨即存取,即數組的[]操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷貝,另外,當該數組後的記憶體空間不夠時需要重新申請一塊足夠大的記憶體進行記憶體拷貝,大大影響了效率。
同string一樣,對最後元素的操作是最快的,此時一般不需要移動記憶體,只有保留記憶體不夠時才需要分配記憶體進行記憶體拷貝。
對中間和開始處進行添加刪除元素操作需要移動記憶體。如果元素是結構和類,那移動的同時還會進行構造和析構操作,所以效能不高(此時以儲存類對像的指標為好);
訪問方面,由於是連續記憶體的儲存。所以對任何元素的訪問都是O(1),即常數時間完成。
同string一樣可以使用capacity看當前保留的記憶體,使用swap來減少它使用的記憶體。
同樣在堆上分配記憶體;
隨機訪問效率很高
3. <list>
名為:通用鏈表庫
list是一個通用的雙向鏈表模板類,支援任意位置的資料讀寫,插入和刪除操作。
對list的訪問主要通過迭代器實現。
由於是鏈表格儲存體所以記憶體空間上可以是不連續的,通過指標進行資料的訪問,隨機儲存需要遍曆指標所以效率很低。但鏈表的特點,它可以很高的效率進行任意地方的刪除和插入。
沒有記憶體空間預留,所以每次增加元素都會從記憶體中分配空間,每次刪除都會釋放它佔用的記憶體。
因為使用鏈表格儲存體指標的方式,所以添加刪除元素時不存在記憶體拷貝的問題,也沒有對每類對像元素進行構造析構的問題,所以常作隨機操作容器。
但就訪問來說。因為雙向鏈表,只有開始和結尾元素的訪問時間快。其它元素都O(n)
元素在堆上分配;
如果添加刪除大記憶體元素用list比較好。對於list<指標>是效能最低下的做法;
4. <dequet>
Deque是一個雙端隊列,是一個個的堆。每個堆儲存幾個元素,而堆之間使用指標串連,像是list和vector的結合,支援[]操作,也支援隨機存取,可以有較高的隨機訪問速度。
在堆上分配記憶體;
5. <set>
名為:通用集合庫
set或multiset是一個按使用者指定定序將set內的資料進行排序的集合庫,set內不允許有相同的資料,而multiset允許有重複資料。
6.<map>
名為:通用字典庫
map或multimap是一個字典模板類,其索引可以是任意使用者指定類型。且能按使用者指定定序將map內的資料進行排序的集合庫,map內不允許有相同的資料,而multimap允許有重複資料