C++ 具名要求:容器 (Container)
来自cppreference.com
容器 (Container) 是用于存储其他对象并负责管理其所容纳对象内存的对象。
要求
- 元素类型
T
; - 包含
T
类型元素的容器 (Container) 类型C
; -
C
类型的对象 a、b。 -
C
类型的纯右值表达式 rv。
类型
名称 | 类型 | 要求 |
---|---|---|
value_type |
T |
可复制构造 (CopyConstructible) (C++11 前)可擦除 (Erasable) (C++11 起) |
reference |
T& |
|
const_reference |
const T& | |
iterator |
值类型是 T 的迭代器 |
老式向前迭代器 (LegacyForwardIterator) 可转换到 const_iterator
|
const_iterator |
值类型是 T 的常迭代器 |
老式向前迭代器 (LegacyForwardIterator) |
difference_type |
有符号整数 | 必须与 iterator 和 const_iterator 的 iterator_traits::difference_type 相同
|
size_type |
无符号整数 | 大到足以表示所有 difference_type 的正值
|
方法与运算符
表达式 | 返回类型 | 语义 | 条件 | 复杂度 | ||||
---|---|---|---|---|---|---|---|---|
C() | C |
创建空容器 | 后:C().empty() == true |
常数 | ||||
C(a) | C |
创建 a 的副本 | 前:T 必须可复制插入 (CopyInsertable) 后: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 |
|
前:T 必须可相等比较 (EqualityComparable) |
a.size() != b.size() 时是常数[2],否则呈线性 | ||||
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() | 常数 | |||||
注 | ||||||||
|
给定
- 容器的
iterator
类型的对象 i 与 j,
表达式 i == j、i != j、i < j、i <= j、i >= j、i > j、i - j 中,任一或二者都可以用指代相同元素的一个该容器的 const_iterator
类型的对象替换,而不更改其语义。
容器数据竞争
其他要求
- C
- T
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 179 | C++98 | iterator 与 const_iterator 类型可能不可比较
|
要求可比较 |
LWG 276 | C++98 | T 要求 可复制赋值 (CopyAssignable)
|
T 要求 可复制构造 (CopyConstructible)
|
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 不一定有多趟保证
|
它们需要满足 老式向前迭代器 (LegacyForwardIterator) 的要求 |
LWG 2263 | C++11 | LWG 问题 179 的解决方案在 C++11 中被意外丢弃 | 已恢复 |
LWG 2839 | C++11 | 不允许标准容器的自移动赋值 | 容许但结果未指定 |