默认情况下,选用vector,内部数据结构最简单,允许随机存取。

如果经常要在序列头部和尾部插入和删除元素,应该使用deque。如果希望元素被删除时,容器能自动缩减内存,那么也要选deque。此外,由于vector通常采用一个内存块存放元素,而deque采用多个内存块,后者可包含更多元素。

如果需要经常在容器中段执行元素的插入、删除或移动,可考虑list。list提供特殊成员函数,可在常数时间将元素从A容器转移到B容器。但由于list不支持随机存取,如果只知道list的头部却要访问中段元素,性能较低。

和所有“以节点为基础”的容器相似,只要元素还是容器的一部分,list就不会令指向那些元素的迭代器失效。vector则不然,一旦超过容量,它所有的迭代器、指针和引用都会失效;执行插入和删除时,也会令部分失效。对于deque,当它大小改变时,所有都会失效

如果你要的容器需要“每次操作失败便无效用”,应该选list,或是关联容器。

如果经常需要根据某个准则来查询元素,应当使用“以该排序准则对元素进行排序”的set或multiset。

处理键值对,使用unordered_map或unordered_multimap;如果对元素的顺序有要求就使用map或multimap

如果需要使用关联数组,选用unordered_map;如果对元素的顺序有要求就使用map

如果需要使用字典,选用unordered_multimap;如果对元素的顺序有要求就使用multimap

Array

Vector

Deque

List

Forward List

关联容器

无序容器

出现

TR1

C++98

C++98

C++98

C++11

C++98

TR1

内部结构

Static array

Dynamic array

Array of arrays

Doubly linked list

Singly linked list

Binary tree

Hash table

元素类型

Value

Value

Value

Value

Value

Set:value

Map:key/value

Set:value

Map:key/value

重复可元素






只有multiset、multimap

只有multiset、multimap

迭代器类型

随机存取

随机存取

随机存取

双向

前向

双向

前向

扩大/收缩

从不

一端

两端

随意

随意

随意

随意

随机存取







大部分

查询




很慢

很慢


很快

插入/删除迭代器失效

-

重分配

总是

从不

从不

从不

重新生产哈希表

插入/删除指针和引用失效

-

重分配

总是

从不

从不

从不

从不

允许设置内存

-



-

-

-


删除元素会释放内存

-

只能使用shrink_to_fit()

有时

总是

总是

总是

有时