容器库
容器库是一些通用的类模板与算法的汇集,允许程序员简单地实现如队列、链表和栈这样的常见数据结构。有两 (C++11 前)三 (C++11 起)类容器:
- 顺序容器
- 关联容器
|
(C++11 起) |
它们被设计为各自支持一组不同的操作。
容器管理着为其元素分配的存储空间,并提供成员函数来直接访问或通过迭代器(具有类似于指针的属性的对象)访问它们。
大多数容器都至少有几个共同的成员函数,并且共享功能。哪种类型的容器对于特定应用才是最佳选择,通常不仅仅取决于容器提供的功能,还取决于其在不同工作负载上的效率(复杂性)。对于序列容器来说尤其如此,它在插入/删除元素和访问它们之间的复杂性上提供了不同的权衡。
目录 |
[编辑] 序列容器
序列容器实现能按顺序访问的数据结构。
| (C++11) |
固定大小的原位连续数组 (类模板) |
| 动态的连续数组 (类模板) | |
| (C++26) |
可动态调整大小的原位连续数组 (类模板) |
| 双端队列 (类模板) | |
| (C++11 起) |
单链表 (类模板) |
| 双链表 (类模板) |
[编辑] 关联容器
关联容器实现能快速查找(O(log n) 复杂度)的有序数据结构。
| 唯一键的集合,按照键排序 (类模板) | |
| 键值对的集合,按照键排序,键是唯一的 (类模板) | |
| 键的集合,按照键排序 (类模板) | |
| 键值对的集合,按照键排序 (类模板) |
[编辑] 无序关联容器 (C++11 起)
无序关联容器提供能快速查找(平均 O(1),最坏情况 O(n) 的复杂度)的无序(散列)数据结构。
| (C++11 起) |
唯一键的集合,按照键生成散列 (类模板) |
| (C++11 起) |
键值对的集合,按照键生成散列,键是唯一的 (类模板) |
| (C++11 起) |
键的集合,按照键生成散列 (类模板) |
| (C++11 起) |
键值对的集合,按照键生成散列 (类模板) |
[编辑] 容器适配器
容器适配器为顺序容器提供了不同的接口。
| 适配一个容器以提供栈(LIFO 数据结构) (类模板) | |
| 适配一个容器以提供队列(FIFO 数据结构) (类模板) | |
| 适配一个容器以提供优先级队列 (类模板) | |
| (C++23) |
调整容器以提供按键排序的唯一键集合 (类模板) |
| (C++23) |
适配两个容器以提供按唯一键排序的键值对集合 (类模板) |
| (C++23) |
调整容器以提供按关键字排序的关键字集合 (类模板) |
| (C++23) |
适配两个容器以提供按键排序的键值对集合 (类模板) |
[编辑] 视图
视图提供了灵活的设施,用以在不拥有元素的数组上建立的一维或多维视图之间进行交互。
| (C++20) |
连续的对象序列上的无所有权视图 (类模板) |
| (C++23) |
多维非拥有数组视图 (类模板) |
[编辑] 迭代器失效
只读方法决不会使迭代器或引用失效。修改容器内容的方法可能会使迭代器和/或引用失效,如下表所示。
| 类别 | 容器 | 插入后…… | 擦除后…… | 条件 | ||
|---|---|---|---|---|---|---|
| 迭代器有效? | 引用有效? | 迭代器有效? | 引用有效? | |||
| 顺序容器 | array | 不适用 | 不适用 | |||
| vector | 否 | 不适用 | 插入更改了容量 | |||
| 是 | 是 | 在被修改元素前 (对于插入,仅当容量未改变) | ||||
| 否 | 否 | 在被修改元素处或元素后 | ||||
| deque | 否 | 是 | 是,除了被擦除元素 | 修改首元素或尾元素 | ||
| 否 | 否 | 只修改中间元素 | ||||
| list | 是 | 是,除了被擦除元素 | ||||
| forward_list | 是 | 是,除了被擦除元素 | ||||
| 关联容器 | set multiset map multimap |
是 | 是,除了被擦除元素 | |||
| 无序关联容器 | unordered_set unordered_multiset unordered_map unordered_multimap |
否 | 是 | 不适用 | 插入导致了重散列 | |
| 是 | 是,除了被擦除元素 | 无重散列 | ||||
| 本节未完成 原因: iterators from C++23 adaptors |
此处插入指代任何添加一或多个元素到容器的方法,而擦除指代任何从容器移除一或多个元素的方法。
|
(C++11 起) |
- 擦除方法的例子是 std::set::erase、std::vector::pop_back、std::deque::pop_front 和 std::map::clear。
-
clear会使所有迭代器和引用失效。因为它会擦除所有元素,这在技术上遵照上述规则。
-
除非另有规定(显式地或通过根据其他函数定义函数), 否则将容器作为实参传递给库函数不会使迭代器失效或更改容器内对象的值。
需要特别留意尾后迭代器(past-the-end iterator)。这种迭代器通常像指向未被擦除元素的正常迭代器一般失效。所以 std::set::end 永远不会失效,std::unordered_set::end 只有在重散列(rehash)时会失效 (C++11 起),std::vector::end 总是会失效(因为它始终在被修改元素后出现),以此类推。
有一个例外:删除 std::deque 末元素的擦除操作会使尾后迭代器失效,尽管它不是容器的被擦除元素(或者说根本不是元素)。与 std::deque 迭代器的通用规则结合后,最终结果是修改操作中只有“删除首元素”(而不是“删除末元素”)不会 使std::deque::end 失效。
线程安全
|
(C++11 起) |
[编辑] 函数表格
注意:std::basic_string 不被标准视为容器,但由于其相似性,其行为与容器非常相似。为方便起见,此处将其列为“伪容器”(Pseudo container)。
| - C++03 起存在的函数 | |
| - C++11 起存在的函数 | |
| - C++17 起存在的函数 | |
| - C++20 起存在的函数 | |
| - C++23 起存在的函数 |
[编辑] 成员函数表格
- 注意:两个不同的 extract 行中的函数具有不同的含义和语法:
[编辑] 非成员函数表
| 伪容器 | 序列容器 | 关联容器 | 无序关联容器 | 容器适配器 | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 头文件 | <string>
|
<array>
|
<vector>
|
<deque>
|
<forward_list>
|
<list>
|
<set>
|
<map>
|
<unordered_set>
|
<unordered_map>
|
<stack>
|
<queue>
|
<flat_set>
|
<flat_map>
|
头文件 | |||||||||||||||||||||||||||||||
| 容器 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
容器 | ||||||||||||||||||||||||
| 非成员函数 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
非成员函数 | |||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| ||||||||||||||||||||||||
|
|
|
|
|
|
| ||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| ||||||||||||||||||||||||||||
| 容器 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
容器 | ||||||||||||||||||||||||
| 头文件 | <string>
|
<array>
|
<vector>
|
<deque>
|
<forward_list>
|
<list>
|
<set>
|
<map>
|
<unordered_set>
|
<unordered_map>
|
<stack>
|
<queue>
|
<flat_set>
|
<flat_map>
|
头文件 | |||||||||||||||||||||||||||||||
| 伪容器 | 序列容器 | 关联容器 | 无序关联容器 | 容器适配器 | ||||||||||||||||||||||||||||||||||||||||||
|
|
(C++20 起) |
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 51 | C++98 | 容器迭代器可能会由于任意库操作而失效 | 只有在指定情况下会失效 |
[编辑] 参阅
C++ 具名要求:
- 容器 (Container)
- 序列容器 (SequenceContainer)
- 连续容器 (ContiguousContainer)
- 可逆容器 (ReversibleContainer)
- 关联容器 (AssociativeContainer)
- 知分配器容器 (AllocatorAwareContainer)
- 无序关联容器 (UnorderedAssociativeContainer)
| 数值数组,数组掩码和数组切分 (类模板) | |
| 存储并操作字符序列 (类模板) | |
| (C++17) |
只读的字符串视图 (类模板) |

Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.
