C++ 具名要求:容器 (Container)
来自cppreference.com
容器 (Container) 是用于存储其他对象并照顾管理其所容纳的对象所用的内存的对象。
要求
- 容器类型
C
; - 元素类型
T
; -
C
类型的对象a
、b
。 -
rv
,C
类型右值表达式。
类型
名称 | 类型 | 注解 |
---|---|---|
value_type |
T | 可擦除 (Erasable) |
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& | 销毁或从 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() && std::equal(a.begin(), a.end(), b.begin()) (C++14 前)std::equal(a.begin(), a.end(), b.begin(), b.end()) (C++14 起) |
前: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++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 179 | C++98 | iterator 与 const_iterator 类型可能不可比较
|
要求可比较 |
LWG 2263 | C++11 | LWG179 的解决方案在 C++11 中被意外丢弃 | 已恢复 |
LWG 2839 | C++11 | 不允许标准容器的自移动赋值 | 容许但结果未指定 |