• 容器:一种数据结构,以模板类的方式提供;(存储数据对象)
  • 算法:用于操作容器中数据的模板函数;(对数据进行处理)
  • 迭代器:提供了访问容器中对象的方法;(相当于指针)

       迭代器是容器和算法交互的桥梁;

 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

list

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 
reserve

 

splice
remove
remove_if
unique
merge
sort 
reverse

 

 

 

 

posted on 2019-08-28 22:32  Love63  阅读(222)  评论(0编辑  收藏  举报