容器的选用
默认情况下,选用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() | 有时 | 总是 | 总是 | 总是 | 有时 |