C++ 具名要求:容器 (Container)

来自cppreference.com
< cpp‎ | named req
 
 
C++ 具名要求
基础
类型属性
库所属
容器
容器元素
迭代器
流 I/O
随机数
并发
(C++11)
(C++11)
其他
 

容器 (Container) 是用于存储其他对象并照顾管理其所容纳的对象所用的内存的对象。

要求

  • 容器类型 C
  • 元素类型 T
  • C 类型的对象 ab
  • rvC 类型右值表达式。

类型

名称 类型 注解
value_type T 可擦除 (Erasable)
reference T&
const_reference const T&
iterator 指向 T 的迭代器 老式向前迭代器 (LegacyForwardIterator)
可转换为 const_iterator
const_iterator 指向 T 的常迭代器 老式向前迭代器 (LegacyForwardIterator)
difference_type 有符号整数 必须与 iteratorconst_iteratoriterator_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 交换 ab 的值 常数[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. 1.0 1.1 1.2 std::array 为线性
  2. 对于 std::forward_list 始终为线性
  3. 3.0 3.1 3.2 (C++11 前) 非严格常数

给定

  • 容器的 iterator 类型的对象 ij

表达式 i == ji != ji < ji <= ji >= ji > ji - j 中,任一或二者都可以用指代相同元素的一个该容器的 const_iterator 类型的对象替换,而不更改其语义。

容器数据竞争

容器线程安全

其他要求

C
T

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR 应用于 出版时的行为 正确行为
LWG 179 C++98 iteratorconst_iterator 类型可能不可比较 要求可比较
LWG 2263 C++11 LWG179 的解决方案在 C++11 中被意外丢弃 已恢复
LWG 2839 C++11 不允许标准容器的自移动赋值 容许但结果未指定

参阅