STL 容器

ISO 标准模板库 (STL) 为存储相关对象的集合提供容器。 容器是能够启用容器中允许的对象规范的模板类。

备注

本文不适用于 STL/CLR。有关更多信息,请参见 STL/CLR 库参考

STL 中的容器可以分为三个类别:序列容器、关联容器和容器适配器。

序列容器

序列容器维护你指定的插入元素的顺序。

vector 容器的行为类似于数组,但可以根据要求自动增长。 它可以随机访问、连续存储,长度也非常灵活。 基于上述和其他原因,vector 是多数应用程序的首选序列容器。 有关更多信息,请参见 vector 类

array 容器具备 vector 的某些优点,但长度不够灵活。 有关更多信息,请参见 array 类 (STL)

deque(双端队列)容器支持在容器的起点和终点进行快速插入和删除。 它享有 vector 随机访问和长度灵活的优点,但是不具备连续性。 有关更多信息,请参见 deque 类

list容器是双向链表,在容器内的任意位置启用了双向访问、快速插入和快速删除,但是你不能随机访问此容器中的元素。 有关更多信息,请参见 list 类

forward_list 容器是单独链表,list 的向前访问版本。 有关更多信息,请参见 forward_list 类

关联容器

在关联容器中,按照预定义的顺序插入元素,例如按升序排序。 无序的关联容器也可用。 关联容器可分为两个子集:映射和组集。

map,有时称为字典,包含键/值对。 键用于对序列排序,值与该键关联。 例如,map可能包含许多键(代表文本中每个独特的单词)和相应的值(代表每个单词在文本中出现的次数)。 map的无序版本是 unordered_map。 有关更多信息,请参见map 类unordered_map 类

set仅是按升序排列每个元素的容器,值也是键。 set的无序版本是 unordered_set。 有关更多信息,请参见set 类unordered_set 类

mapset 都仅允许将键或元素的一个实例插入容器中。 如果需要元素的多个实例,请使用multimapmultiset。 无序版本是 unordered_multimapunordered_multiset。 有关更多信息,请参见 multimap 类unordered_multimap 类multiset 类unordered_multiset 类

有序的映射和组集支持双向迭代器,其未排序副本支持向前迭代器。 有关更多信息,请参见迭代器

容器适配器

容器适配器是序列容器或关联容器的变体,为了简单明确起见,它对接口进行限制。 容器适配器不支持迭代器。

queue容器遵循 FIFO(先进先出)语义。 第一个推送(即插入队列中)的元素将第一个弹出(即从队列中移除)。 有关更多信息,请参见 queue 类

priority_queue容器也是如此组织,因此具有最高值的元素始终排在队列的第一位。 有关更多信息,请参见 priority_queue 类

stack容器遵循 LIFO(后进先出)语义。 堆栈上最后推送的元素将第一个弹出。 有关更多信息,请参见 stack 类

由于容器适配器不支持迭代器,因此无法与 STL 算法一起使用。 有关更多信息,请参见算法

容器元素的要求

通常,如果插入 STL 容器中的元素可复制,那么这些元素可以是任何对象类型。 只要你不调用尝试复制元素的成员函数,仅可移动的元素(例如,那些类似于 vector<unique_ptr<T>>、使用 unique_ptr<> 创建的元素)会一直工作。

析构函数不允许引发异常。

有序的关联容器(本文之前所述)必须已定义公共比较运算符。(默认情况下,该运算符是 operator<,即使不能与 operator< 共同使用的类型也会受支持。)

容器中的某些操作可能还需要公共默认构造函数和公共等效运算符。 例如,未排序的关联容器需要支持相等性和哈希处理。

正在访问容器元素

使用迭代器访问容器的元素。 有关更多信息,请参见迭代器

备注

你还可以使用基于范围的 for 循环来循环访问 STL 集合。

请参见

参考

标准模板库

<sample container>

C++ 标准库中的线程安全

概念

容器(现代 C++)