Stl各容器對比
1. vector
變長一維陣列,連續存放的記憶體塊,有保留記憶體,堆中分配記憶體;
支援[]操作,高效率的隨機訪問;
在最後增加元素時,一般不需要分配記憶體空間,速度快;在中間或開始操作元素時要進行記憶體拷貝效率低;
vector高效的原因在於配置了比其所容納的元素更多的記憶體,記憶體重新配置會花很多時間;
注:需要高效的隨即存取,而不在乎插入和刪除使用vector。
2. list
雙向連結串列,記憶體空間上可能是不連續的,無保留記憶體,堆中分配記憶體;
不支援隨機存取,開始和結尾元素的訪問時間快,其它元素都O(n);
在任何位置安插和刪除元素速度都比較快,安插和刪除操作不會使其他元素的各個pointer
注:大量的插入和刪除,而不關係隨即存取使用list。
3. deque
雙端佇列,在堆上分配記憶體,一個堆儲存幾個元素,而堆之間使用指標連線;
支援[]操作,在首端和末端插入和刪除元素比較快,在中部插入和刪除則比較慢,像是list和vector的結合;
注:關心插入和刪除並關心隨即存取折中使用deque。
4. set multiset
有序集合,使用平衡二叉樹儲存,按照給定的排序規則(預設按less排序)對set中的資料進行排序;
set中不允許有重複元素,multiset中執行有重複元素;
兩者不支援直接存取元素的操作;
因為是自動排序,查詢元素速度比較快;
不能直接改變元素值,否則會打亂原本正確的順序,必須先下刪除舊元素,再插入新的元素。
5. map multimap
字典庫,一個值對映成另一個值,使用平衡二叉樹儲存,按照給定的排序規則對map中的key值進行排序;
map中的key值不允許重複,multimap中的key允許重複;
根據已知的key值查詢元素比較快;
插入和刪除操作比較慢。
STL中各容器的對比表:
順序容器 |
關聯容器 |
|||||||||
大類 |
<vector> |
<deque> |
<list> |
<set> |
<map> |
<bitset> |
||||
Members |
complex |
vector |
deque |
set |
multiset |
map |
multimap |
bitset |
||
constructor |
* |
constructor |
constructor |
constructor |
constructor |
constructor |
constructor |
constructor |
constructor |
|
destructor |
O(n) |
destructor |
destructor |
destructor |
destructor |
destructor |
destructor |
destructor |
||
operator= |
O(n) |
operator= |
operator= |
operator= |
operator= |
operator= |
operator= |
operator= |
operators |
|
iterators |
begin |
O(1) |
begin |
begin |
begin |
begin |
begin |
begin |
begin |
|
end |
O(1) |
end |
end |
end |
end |
end |
end |
end |
||
rbegin |
O(1) |
rbegin |
rbegin |
rbegin |
rbegin |
rbegin |
rbegin |
rbegin |
||
rend |
O(1) |
rend |
rend |
rend |
rend |
rend |
rend |
rend |
||
capacity |
size |
* |
size |
size |
size |
size |
size |
size |
size |
size |
max_size |
* |
max_size |
max_size |
max_size |
max_size |
max_size |
max_size |
max_size |
||
empty |
O(1) |
empty |
empty |
empty |
empty |
empty |
empty |
empty |
||
resize |
O(n) |
resize |
resize |
resize |
||||||
element access |
front |
O(1) |
front |
front |
front |
|||||
back |
O(1) |
back |
back |
back |
||||||
operator[] |
* |
operator[] |
operator[] |
operator[] |
operator[] |
|||||
at |
O(1) |
at |
at |
|||||||
modifiers |
assign |
O(n) |
assign |
assign |
assign |
|||||
insert |
* |
insert |
insert |
insert |
insert |
insert |
insert |
insert |
||
erase |
* |
erase |
erase |
erase |
erase |
erase |
erase |
erase |
||
swap |
O(1) |
swap |
swap |
swap |
swap |
swap |
swap |
swap |
||
clear |
O(n) |
clear |
clear |
clear |
clear |
clear |
clear |
clear |
||
push_front |
O(1) |
push_front |
push_front |
|||||||
pop_front |
O(1) |
pop_front |
pop_front |
|||||||
push_back |
O(1) |
push_back |
push_back |
push_back |
||||||
pop_back |
O(1) |
pop_back |
pop_back |
pop_back |
||||||
observers |
key_comp |
O(1) |
key_comp |
key_comp |
key_comp |
key_comp |
||||
value_comp |
O(1) |
value_comp |
value_comp |
value_comp |
value_comp |
|||||
operations |
find |
O(log n) |
find |
find |
find |
find |
||||
count |
O(log n) |
count |
count |
count |
count |
count |
||||
lower_bound |
O(log n) |
lower_bound |
lower_bound |
lower_bound |
lower_bound |
|||||
upper_bound |
O(log n) |
upper_bound |
upper_bound |
upper_bound |
upper_bound |
|||||
equal_range |
O(log n) |
equal_range |
equal_range |
equal_range |
equal_range |
|||||
unique members |
capacity |
splice |
set |