总结:C++ STL 容器
STL的叫法是“容器”,标准库里面容器不多,数组、链表、红黑树,实现都不负责thread safe、mutable之类,对比下Java的,选择很多,也挺混乱。。
序列容器:动态数组vector,双端队列deque(本质是动态数组加索引),链表list。
关联容器:set,map,multiset,multimap,bitset(叫bit_array更合适)。
容器适配器:stack,queue,priority_queue。
除了bitset,都用到模板,声明大概是这样的:
STL Standard Containers,点击加号展开!
STL Container Adaptors,点击加号展开!
C++是注重效率的,所以STL很强调一点就是amortized的性能,下面的表很不错,还可以用来速查:
set、map一般会实现成红黑树,这就是它的模板声明里面不需要一个类似Equal_to之类的functor来判断找到Key没有的原因:它调用两次Compare来判断等于。要是不用排序这个特性,只看效率搜索树一般比不过哈希表。
还有一点STL里面iterator是一等公民,主要为了很多算法的效率和封装统一接口,但全是iterator我个人觉得用起来有点不舒服。。
C++0x里面会有基于哈希表的unordered_xxx系列(就是现在很多实现里面的hash_xxx),tuple(Variadic templates)等登场。
C++ TR1 Containers,点击加号展开!
最后,除了容器,<algorithm>也是STL中很重要的部分,其实STL最初做出来是想秀泛型算法的。。
Java里面java.util.Collections类做类似的事情。
References:
http://www.cplusplus.com/reference/stl/
http://www.sgi.com/tech/stl/table_of_contents.html
http://www.stlchina.org/
http://www.stlchina.org/documents/EffectiveSTL/index.html
序列容器:动态数组vector,双端队列deque(本质是动态数组加索引),链表list。
关联容器:set,map,multiset,multimap,bitset(叫bit_array更合适)。
容器适配器:stack,queue,priority_queue。
除了bitset,都用到模板,声明大概是这样的:
C++是注重效率的,所以STL很强调一点就是amortized的性能,下面的表很不错,还可以用来速查:
|
Sequence containers |
Associative containers |
|||||||||
|
Headers |
<vector> |
<deque> |
<list> |
<set> |
<map> |
<bitset> |
||||
|
Members |
complex |
|||||||||
|
constructor |
* |
|||||||||
|
destructor |
O(n) |
|||||||||
|
operator= |
O(n) |
|||||||||
|
iterators |
begin |
O(1) |
||||||||
|
end |
O(1) |
|||||||||
|
rbegin |
O(1) |
|||||||||
|
rend |
O(1) |
|||||||||
|
capacity |
size |
* |
||||||||
|
max_size |
* |
|||||||||
|
empty |
O(1) |
|||||||||
|
resize |
O(n) |
|||||||||
|
element access |
front |
O(1) |
||||||||
|
back |
O(1) |
|||||||||
|
operator[] |
* |
|||||||||
|
at |
O(1) |
|||||||||
|
modifiers |
assign |
O(n) |
||||||||
|
insert |
* |
|||||||||
|
erase |
* |
|||||||||
|
swap |
O(1) |
|||||||||
|
clear |
O(n) |
|||||||||
|
push_front |
O(1) |
|||||||||
|
pop_front |
O(1) |
|||||||||
|
push_back |
O(1) |
|||||||||
|
pop_back |
O(1) |
|||||||||
|
observers |
key_comp |
O(1) |
||||||||
|
value_comp |
O(1) |
|||||||||
|
operations |
find |
O(log n) |
||||||||
|
count |
O(log n) |
|||||||||
|
lower_bound |
O(log n) |
|||||||||
|
upper_bound |
O(log n) |
|||||||||
|
equal_range |
O(log n) |
|||||||||
|
unique members |
||||||||||
|
Container Adaptors |
|||||
|
Headers |
<stack> |
<queue> |
|||
|
Members |
|||||
|
constructor |
* |
||||
|
capacity |
size |
O(1) |
|||
|
empty |
O(1) |
||||
|
element access |
front |
O(1) |
|||
|
back |
O(1) |
||||
|
top |
O(1) |
||||
|
modifiers |
push |
O(1) |
|||
|
pop |
O(1) |
||||
set、map一般会实现成红黑树,这就是它的模板声明里面不需要一个类似Equal_to之类的functor来判断找到Key没有的原因:它调用两次Compare来判断等于。要是不用排序这个特性,只看效率搜索树一般比不过哈希表。
还有一点STL里面iterator是一等公民,主要为了很多算法的效率和封装统一接口,但全是iterator我个人觉得用起来有点不舒服。。
C++0x里面会有基于哈希表的unordered_xxx系列(就是现在很多实现里面的hash_xxx),tuple(Variadic templates)等登场。
最后,除了容器,<algorithm>也是STL中很重要的部分,其实STL最初做出来是想秀泛型算法的。。
Java里面java.util.Collections类做类似的事情。
References:
http://www.cplusplus.com/reference/stl/
http://www.sgi.com/tech/stl/table_of_contents.html
http://www.stlchina.org/
http://www.stlchina.org/documents/EffectiveSTL/index.html


浙公网安备 33010602011771号