C++ 命名要求: 容器
一个 容器 是一个用于存储其他对象并管理其所包含对象使用的内存的对象。
要求
T
,一个元素类型;C
,一个包含类型为T
的元素的 容器 类型;a
和b
,类型为C
的对象;rv
,一个类型为C
的纯右值表达式。
类型
名称 | 类型 | 要求 |
---|---|---|
value_type | T | 可复制构造 (直到 C++11) 可擦除 (自 C++11 起) |
reference | T& | |
const_reference | const T& | |
iterator | 迭代器,其值类型为 T | 旧版前向迭代器 可转换为 const_iterator |
const_iterator | 常量迭代器,其值类型为 T | LegacyForwardIterator |
difference_type | 有符号整数 | 必须与迭代器和 const_iterator 的 iterator_traits::difference_type 相同 |
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() | 常量 | |
a == b | 可转换为 bool | a.size() == b.size() && (直到 C++14) std::equal(a.begin(), a.end(), (自 C++14 起) | 前置条件: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() | 常量 |
备注
1 对于 std::array 为线性
2 对于 std::forward_list 始终为线性
3 并非严格常数 (直到 C++11)
给定
i
和j
,容器迭代器类型的对象,
在表达式 i == j
、i != j
、i < j
、i <= j
、i >= j
、i > j
、i - j
中,其中一个或两个可以替换为引用同一元素的容器 const_iterator 类型的对象,且语义不变。
容器数据竞争
参见容器线程安全
其他要求
C
T
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 179 | C++98 | iterator 和 const_iterator 类型可能不可比较 | 要求可比较 |
LWG 276 | C++98 | T 曾要求可复制赋值 | T 要求可复制构造 |
LWG 322 | C++98 | iterator 和 const_iterator 的值类型未指定 | 指定为 T |
LWG 774 | C++98 | 没有关于 swap(a, b) 的要求 | 已添加 |
LWG 2263 | C++11 | LWG 问题 179 的解决方案在 C++11 中被意外删除 | 已恢复 |
LWG 2839 | C++11 | 标准容器的自移动赋值不被允许 | 允许,但结果未指定 |