标准库提供了一些既通用又好用的容器类型,程序员可以根据应用的实际需求选择最适合的容器:

    标准库容器概述
    vector 可变大小向量 31.4节
    list 双向链表 31.4.2节
    forward_list 单向链表 31.4.2节
    deque 双端队列 31.2节
    set 集合 31.4.3节
    multiset 允许重复的集合 31.4.3节
    map 关联数组 31.4.3节
    multimap 允许重复关键字的map 31.4.3节
    unordered_map 采用哈希搜索的map 31.4.3.2节
    unordered_multimap 采用哈希搜索的multimap 31.4.3.2节
    unordered_set 采用哈希搜索的set 31.4.3.2节
    unordered_multiset 采用哈希搜索的multiset 31.4.3.2节

    无序容器针对关键字(通常是一个字符串)搜索进行了优化,这是通过使用哈希表来实现的。
    31.4节将详细介绍与容器有关的知识。前面提到的容器分别定义在< vector>、等头文件中(见4.1.2节和30.2节),这些容器都属于名字空间std。此外,标准库还提供了容器适配器 queue(见31.5.2节)、 stack<T>(见31.5.1节)、 deque<T>(见31.4节)和priority_ queue<T>(见31.5.3节)。标准库还提供了一些更特殊的类似容器的类型,如定长数组array<T,N>(见34.2.1节)和 bitset(见34.2.2节)。
    从符号表示的角度来看,标准库的各种容器和它们的基本操作比较类似。而且,不同容器的操作含义也大致相同。基本操作可用于每一种适用的容器,且可高效实现。例如:

    • begin()end()分别返回指向首元素和尾后位置的迭代器。
    • push back()可用来(高效地)向 vector、list及其他容器末尾添加元素。
    • size()返回元素数目

    形式和语义上的一致性使得程序员可以设计出与标准库容器在使用方式上非常相似的新的容器类型,包含范围检查功能的向量 Vector(见23.2节和24.31节)就是一个很好的例子。容器接口的一致性还便于我们设计与容器类型无关的算法。但是,凡事皆有两面性,某种技术的优点和缺点常常并存。例如,下标操作和遍历 vector的操作很高效也很简单。但另一方面,当我们在 vector中插入或删除元素时,不得不每次都移动元素,效率不佳;list则恰好具有相反的特性。请注意,当序列较短且元素尺寸较小时, vector通常比list高效
    insert()erase()操作也是如此)。推荐将标准库 vector作为存储元素序列的默认类型;只有当你的理由足够充分时,再考虑选择其他容器。