一文快速理解C++容器

容器

一个容器是特定类型对象的几个,在C++标准库中包含了大部分常见的容器。STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,不用单独安装。TSL核心包括3个组件。容器(containers),算法(algorithms),迭代器(iterators)。除此外还有仿函数,内存配置器和配接器。

按照容器的存储结构可以分为顺序容器与关联容器两类。元素在顺序容器的顺序与加入容器时的位置相对应。关联容器的元素位置由元素相关联的字值决定。

顺序容器

顺序容器一般都具有快速顺序访问元素的能力。在以下两点中有性能折中:

  • 向容器添加或删除元素的代价
  • 非顺序访问元素的代价

标准库顺序容器

  • vector, 可变大小数组。可随机访问。在除尾部外插入删除元素慢
  • deque, 双向队列。可随机访问。在头尾插入删除快。
  • list, 双向链表。只支持双向顺序访问。任何位置插入删除速度都快。
  • forward_list单向链表。只支持单向顺序访问。任何位置插入删除都快。
  • array 固定大小数组。支持快速随机访问。不可添加删除元素。
  • string 与vector相似的容器。专门用于保存字符。随机访问快。尾部插入删除快

补充

deque的随机读取实现方法为通过分段的连续内存加map实现。其中map将各段内存地址串起来,表现为一块连续的大内存,以此实现随机访问。

选取容器

基本原则:

  • 一般而言选用vector
  • 如果程序小元素多(会产生大量碎片),且空间额外开销很重要。不要使用list或者forward_list。
  • 随机访问,必须vector或者deque
  • 中间插入list,forward_list
  • 头尾插中间不插,deque
  • 读取时中间插,访问时随机访问
    • 确定是否真的有中插需要。例如vector的sort函数可以进行重排的操作
    • 必须中插可考虑,输入阶段list。完成输入将list拷贝到vector

几乎最全能的容器,deque。一般而言,vector和list足以使用了。

容器类型成员

容器container中包含了一些类型,通过域运算符进行定义。container