Stl各容器对比

来源:互联网 发布:免费顶级域名注册 编辑:程序博客网 时间:2024/06/06 01:17

1. vector

    变长一维数组,连续存放的内存块,有保留内存,堆中分配内存;

    支持[]操作,高效率的随机访问;

    在最后增加元素时,一般不需要分配内存空间,速度快;在中间或开始操作元素时要进行内存拷贝效率低;

    vector高效的原因在于配置了比其所容纳的元素更多的内存,内存重新配置会花很多时间;

注:需要高效的随即存取,而不在乎插入和删除使用vector

 

2. list

    双向链表,内存空间上可能是不连续的,无保留内存,堆中分配内存;

    不支持随机存取,开始和结尾元素的访问时间快,其它元素都On);

    在任何位置安插和删除元素速度都比较快,安插和删除操作不会使其他元素的各个pointerreferenceiterator失效;

注:大量的插入和删除,而不关系随即存取使用list

 

3. deque

    双端队列,在堆上分配内存,一个堆保存几个元素,而堆之间使用指针连接;

    支持[]操作,在首端和末端插入和删除元素比较快,在中部插入和删除则比较慢,像是listvector的结合;

注:关心插入和删除并关心随即存取折中使用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

list

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 
reserve

 

splice
remove
remove_if
unique
merge
sort 
reverse

 

 

 

 

set
reset
flip 
to_ulong
to_string 
test 
anynone

 参考:http://www.cnblogs.com/fangyukuan/archive/2010/09/21/1832675.html

0 0