C++ 命名需求: 容器
来自 cppreference.com
一个 容器 是用于存储其他对象并负责管理其包含的对象使用的内存的对象。
内容 |
[编辑] 需求
[编辑] 图例
-
T
,一个元素类型; -
C
,一个包含类型为T
的元素的 容器 类型; - a 和 b,类型为
C
的对象; - i 和 j,(可能是 const)类型为
C::iterator
的值; - rv,类型为
C
的纯右值表达式。
[编辑] 成员类型
名称 | 类型 | 需求 |
---|---|---|
C::value_type |
T |
可复制构造(直到 C++11)可擦除(自 C++11) |
C::reference |
T& |
|
C::const_reference |
const T& | |
C::iterator |
其 值类型 为 T 的迭代器 |
传统前向迭代器 可转换为 const_iterator |
C::const_iterator |
其 值类型 为 T 的常量迭代器 |
传统前向迭代器 |
C::difference_type |
带符号整数 | 必须与 iterator 和 const_iterator 的 iterator_traits::difference_type 相同 |
C::size_type |
无符号整数 | 足够大以表示 difference_type 的所有正值 |
[编辑] 成员函数和运算符
表达式 | 返回类型 | 语义 | 条件 | 复杂度 | ||||
---|---|---|---|---|---|---|---|---|
C() | C |
创建一个空容器 | 后置条件:C().empty() == true |
常量 | ||||
C(a) | C |
创建一个 a 的副本 | 前置条件:T 必须是 可复制插入 后置条件:a == C(a) |
线性 | ||||
C(rv) (自 C++11) |
C |
移动 rv | 后置条件:等于此构造之前 rv 的值 | 常量[1] | ||||
a = b | C& |
销毁或从 b 的元素复制赋值 a 的所有元素 | 后置条件:a == b | 线性 | ||||
a = rv (自 C++11) |
C& |
销毁或从 rv 的元素移动赋值 a 的所有元素 | 后置条件:如果 a 和 rv 不引用同一个对象,则 a 等于此赋值之前 rv 的值 | 线性 | ||||
a.~C() | void | 销毁 a 的所有元素并释放所有内存 | 线性 | |||||
a.begin() | (const_)iterator |
指向 a 的第一个元素的迭代器 | 常量 | |||||
a.end() | (const_)iterator |
指向 a 的最后一个元素之后的迭代器 | 常量 | |||||
a.cbegin() (自 C++11) |
const_iterator |
const_cast<const C&>(a).begin() | 常量 | |||||
a.cend() (自 C++11) |
const_iterator |
const_cast<const C&>(a).end() | 常量 | |||||
i <=> j (自 C++20) |
strong_ordering |
容器迭代器的三路比较 | C::iterator 满足随机访问迭代器要求 | 常量 | ||||
a == b | bool |
|
前置条件:T 必须是 可相等比较 |
常量[2] 如果
a.size() != b.size(), 否则为线性 | ||||
a != b | bool | !(a == b) | 线性 | |||||
a.swap(b) | void | 交换 a 和 b 的值 | 常数[1][3] | |||||
swap(a, b) | void | a.swap(b) | 常数[1] | |||||
a.size() | size_type |
std::distance(a.begin(), a.end()) | 常数[3] | |||||
a.max_size() | size_type |
b.size(),其中 b 是可能的最大容器 | 常数[3] | |||||
a.empty() | bool | a.begin() == a.end() | 常量 | |||||
备注 | ||||||||
|
给定
-
i
和j
,容器的iterator
类型对象
在表达式 i == j,i != j,i < j,i <= j,i >= j,i > j,i - j 中,可以将任一个或两个替换为容器的 const_iterator
类型对象,该对象引用相同元素,语义不变。
[编辑] 可选容器要求 (自 C++20 起)
以下操作仅针对某些类型的容器提供。
如果传递给 std::lexicographical_compare_three_way 的迭代器满足 ConstexprIterator,则以下描述的操作由 constexpr 函数实现。
类别 | 描述 |
---|---|
表达式 | a <=> b |
返回 |
std::lexicographical_compare_three_way(a.begin(), a.end(), |
结果 | synth-three-way-result<C::value_type> |
先决条件 | 要么 T 符合 three_way_comparable ,要么 < 针对 (可能是 const) 类型 T 的值定义,并且 < 是一个全序关系。 |
复杂度 | 线性 |
[编辑] 容器数据竞争
请参阅 容器线程安全性.
[编辑] 其他要求
C
(容器)
T
(类型)
[编辑] 缺陷报告
以下行为更改的缺陷报告被追溯应用到先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 179 | C++98 | iterator 和 const_iterator 类型可能无法比较 |
要求可比较 |
LWG 276 | C++98 | T 要求为 CopyAssignable |
T 要求为可复制构造 |
LWG 322 | C++98 | 未指定 iterator 和 const_iterator 的值类型 |
指定为 T |
LWG 774 | C++98 | 未对 swap(a, b) 提出要求 | 添加了 |
LWG 883 | C++98 | a.swap(b) 被定义为 swap(a, b) 导致循环定义 |
定义为交换 a 和 b 的值 |
LWG 1319 | C++98 | iterator 和 const_iterator 可能没有多遍保证 |
要求满足 的要求 传统前向迭代器 |
LWG 2114 (P2167R3) |
C++98 | 允许某些函数的非 bool 返回类型 | 不允许 |
LWG 2263 | C++11 | 对 LWG 问题 179 的解决在 C++11 中意外被删除 | 恢复 |
LWG 2839 | C++11 | 不允许标准容器的自移动赋值 | 允许但 结果未指定 |
[编辑] 另请参阅
C++ 文档 容器库
|