目录
- 1 概述
- 2 分类
- 2.1 前向迭代器容器
- 2.2 双向迭代器容器
- 2.3 随机访问迭代器容器
- 2.4 容器适配器
- 2.5 位集
1 概述
在C++标准库中容器是通过模板实现的数据结构,多数可以通过迭代器统一访问,包括:
-
array
数组是固定大小的序列容器:它们包含以严格线性序列排序的特定数量的元素。
与其他标准容器不同,数组具有固定的大小,并且不通过分配器管理其元素的分配:它们是封装固定大小的元素数组的聚合类型。因此,它们不能动态地展开或收缩。 -
bitset
位集存储位(只有两个可能值的元素:0或1,true或false)
位集的大小在编译时是固定的(由其模板参数决定)。对于一个同时优化空间分配并允许动态调整大小的类,请参阅向量的布尔特化(vector<bool>)。 -
deque
双端队列是具有动态大小的序列容器,可以在两端(前端或后端)进行扩展或收缩。
对于涉及在除开头或结尾以外的位置频繁插入或删除元素的操作,与列表和前向列表相比,deques的性能更差,迭代器和引用的一致性也更低。 -
forward_list
前向列表是序列容器,允许在序列中的任何位置进行恒定时间的插入和擦除操作
前向列表被实现为单链表;单链表可以将它们所包含的每个元素存储在不同且不相关的存储位置。通过与序列中下一个元素的链接的每个元素的关联来保持排序 -
list
列表是序列容器,允许在序列中的任何位置进行恒定时间的插入和擦除操作,以及双向迭代。
列表容器被实现为双链表;双链接列表可以将它们所包含的每个元素存储在不同且不相关的存储位置。排序是通过与每个元素的关联在内部保持的,其中链接到它前面的元素,链接到它后面的元素。 -
map/multimap
映射是关联容器,存储由键值和映射值的组合组成的元素,遵循特定的顺序。
多重映射是关联容器,用于存储由键值和映射值的组合形成的元素,遵循特定顺序,并且其中多个元素可以具有等效键 -
queue/priority_queue
队列是一种容器适配器,专门设计用于在FIFO上下文(先进先出)中操作,其中元素被插入容器的一端并从另一端提取标准容器类deque和list满足这些要求。默认情况下,如果没有为特定的队列类实例化指定容器类,则使用标准容器deque。
优先级队列是一种容器适配器,专门设计为根据一些严格的弱排序标准,它的第一个元素始终是它所包含的元素中最大的一个。 -
set/multiset
集合(set)是按照特定顺序存储唯一元素的容器。 在集合中,元素的值也标识它(值本身就是键,类型为T),并且每个值都必须是唯一的。集合中元素的值不能在容器中修改(元素总是常量),但可以从容器中插入或删除它们。
多集(multiset)是按照特定顺序存储元素的容器,其中多个元素可以具有等效值。 在多集合中,元素的值也标识它(值本身就是键,类型为T)。多集合中元素的值不能在容器中修改(这些元素总是常量),但可以从容器中插入或删除它们。 -
stack
栈是一种容器适配器,专门设计用于在后进先出(后进先出)环境中操作,其中元素仅从容器的一端插入和提取。 -
unordered_map/unordered_multimap
无序映射是一种关联容器,用于存储由键值和映射值组合而成的元素,并允许基于其键快速检索单个元素。
无序多重映射是关联容器,存储由键值和映射值的组合形成的元素,与无序映射容器非常相似,但允许不同的元素具有等效的键。 -
unordered_set/unordered_multiset
无序集是不按特定顺序存储唯一元素的容器,允许根据单个元素的值快速检索这些元素。 无序集合容器比集合容器更快地通过关键字访问单个元素,尽管它们通常在通过元素子集进行范围迭代时效率较低。无序多集是不按特定顺序存储元素的容器,允许根据单个元素的值快速检索这些元素,与无序集容器非常相似,但允许不同的元素具有相同的值。
-
vector
向量(vector)是序列容器,表示可以更改大小的数组。
就像数组一样,向量为其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中一样高效。但与数组(array)不同的是,它们的大小可以动态变化,其存储由容器自动处理。
各容器类图:
2 分类
2.1 前向迭代器容器
容器列表:
- std::forward_list
- std::unordered_map
- std::unordered_multimap
- std::unordered_set
- std::unordered_multiset
特征:
- 通过begin/end/cbegin/cend从前到后顺序访问元素。
2.2 双向迭代器容器
容器列表:
- std::list
- std::map
- std::multi_map
- std::set
- std::multi_set
特征:
- 通过begin/end/cbegin/cend从前到后顺序访问元素。
- 通过rbegin/rend/crbegin/crend从后到前顺序访问元素。
2.3 随机访问迭代器容器
容器列表:
- std::array
- std::deque
- std::vector
特征:
- 通过begin/end/cbegin/cend从前到后顺序访问元素。
- 通过rbegin/rend/crbegin/crend从后到前顺序访问元素。
- 通过[]操作符随机访问元素,不做索引越界检查
- 通过at函数随机访问元素,做索引越界检查,越界抛异常
2.4 容器适配器
容器适配器是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。
列表:
- std::queue
- std::priority_queue
- std::stack
2.5 位集
位集是容器中唯一一个不是容器适配器,但不能通过迭代器访问的容器。
列表:
- std::bitset