- 容器:一种数据结构,以模板类的方式提供;(存储数据对象)
- 算法:用于操作容器中数据的模板函数;(对数据进行处理)
- 迭代器:提供了访问容器中对象的方法;(相当于指针)
迭代器是容器和算法交互的桥梁;
1、序列容器和关联容器
序列容器 |
关联容器 |
||||||
|
vector |
deque |
list |
set |
multiset |
map |
multimap |
名称 |
向量容器 |
双端队列容器 |
列表容器 |
集合 |
多重集合 |
映射 |
多重映射 |
内部数据 结构 |
连续存储的数组(末端开口的数组) |
连续或分段连续存储的数组(两端开口的数组) |
双向链表 |
红黑树(平衡检索二叉树) |
红黑树 |
红黑树 |
红黑树 |
结构 |
线性结构 |
线性结构 |
线性结构 |
非线性 |
非线性 |
非线性 |
非线性 |
头文件 |
<vector> |
<deque> |
<list> |
<set> |
<set> |
<map> |
<map> |
操作元素方式 |
下标运算符;可以用迭代器但插入、删除操作时会失效 |
下标运算符; 迭代器; |
只能用迭代器 |
迭代器 |
迭代器 |
迭代器 |
迭代器 |
特点
|
增加和获取元素效率很高;插入和删除元素效率很低; |
增加和获取元素效率较高; 插入和删除效率很高 |
增加和获取元素效率很低;插入和删除的效率很高; |
键(关键字)和值(数据)相等;键唯一;元素默认按升序排列 |
键和值相等;键可以不唯一;元素默认可以不唯一; |
键和值分开(模板有两个参数);键唯一;元素默认按照键升序排列; |
键和值分开;键可以不唯一;元素默认按键的升序排列; |
优缺点 |
查询和末端添加元素性能好; 在中间插入和删除元素性能差; |
兼顾数组和链表的优点,比list查询性能好,比vector插入和删除性能好 |
插入和删除元素性能好; 查询性能差 |
元素的值唯一; 自动被排序; 元素值不能改变; |
元素的值不唯一; 自动被排序; 元素值不能改变; |
键值唯一; 键值自动被排序; |
键值不唯一; 键值自动排序; |
综合比较 |
1、关联容器对元素的插入和删除操作比vector 要快,因为vector 是顺序存储,而关联容器是链式存储;比list 要慢,是因为即使它们同是链式结构,但list 是线性的,而关联容器是二叉树结构,其改变一个元素涉及到其它元素的变动比list 要多,并且它是排序的,每次插入和删除都需要对元素重新排序; 2、关联容器对元素的检索操作比vector 慢,但是比list 要快很多。vector 是顺序的连续存储,当然是比不上的,但相对链式的list 要快很多是因为list 是逐个搜索,它搜索的时间是跟容器的大小成正比,而关联容器 查找的复杂度基本是Log(N) ,比如如果有1000 个记录,最多查找10 次,1,000,000 个记录,最多查找20 次。容器越大,关联容器相对list 的优越性就越能体现; |
2、容器适配器
容器适配器 |
|||
stack |
queue |
priority_queue |
|
名称 |
栈 |
队列 |
优先级队列 |
内部数据结构 |
底层默认使用deque的数据结构,将一端封闭,实现先进后出的行为。 |
底层默认使用deque的数据结构,封闭低端的出口和顶端的入口,实现先进先出(从底端入,从顶端出)的性质。 |
带权队列,即queue中的元素不是按照被推入的次序排列,而是按照元素的权值(实值)排列,权值最高的,排在最前面。默认情况下底层使用max_heap(以vector)实现以“权值高低自动排序”的特性。 |
头文件 |
<stack> |
<queue> |
<queue> |
特点 |
先进后出:只能在顶端插入、删除和取得元素,所以不允许进行遍历,没有迭代器。 |
先进先出:只能从队尾插入元素,从队首删除元素,所以也不允许遍历行为。没有迭代器。 |
在默认的优先队列中,优先级高的先出队。在默认的int型中先出队的为较大的数。与queue一样,qriority_queue不提供遍历的功能,也不提供迭代器。 |
适配器是容器的接口,它本身不能直接保存元素,它保存元素的机制是调用另一种顺序容器去实现,即可以把适配器看作“它保存一个容器,这个容器再保存所有元素”。 |
3、STL成员函数对比
Sequence containers |
Associative containers |
||||||||
Headers |
<vector> |
<deque> |
<list> |
<set> |
<map> |
||||
Members |
complex |
vector |
deque |
set |
multiset |
map |
multimap |
||
|
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= |
|
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 |
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[] |
|
|
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 |
|
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 |
|
|
|
|