跳到主要内容

C++ 命名要求: 容器

一个 容器 是一个用于存储其他对象并管理其所包含对象使用的内存的对象。

要求

  • T,一个元素类型;
  • C,一个包含类型为 T 的元素的 容器 类型;
  • ab,类型为 C 的对象;
  • rv,一个类型为 C 的纯右值表达式。

类型

名称类型要求
value_typeT可复制构造 (直到 C++11) 可擦除 (自 C++11 起)
referenceT&
const_referenceconst T&
iterator迭代器,其值类型为 T旧版前向迭代器 可转换为 const_iterator
const_iterator常量迭代器,其值类型为 TLegacyForwardIterator
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 = bC&销毁或从 b 的元素复制赋值 a 的所有元素后置条件:a == b线性
a = rv (自 C++11 起)C&销毁或从 rv 的元素移动赋值 a 的所有元素后置条件:如果 arv 不引用同一个对象,则 a 等于 rv 在此赋值之前的值线性
a.~C()void销毁 a 的所有元素并释放所有内存线性
a.begin()(const_)iterator指向 a 的第一个元素的迭代器常量
a.end()(const_)iterator指向 a 的最后一个元素之后一个位置的迭代器常量
a.cbegin() (自 C++11 起)const_iteratorconst_cast<const C&>(a).begin()常量
a.cend() (自 C++11 起)const_iteratorconst_cast<const C&>(a).end()常量
a == b可转换为 boola.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 必须是 可相等比较的常数[2] 如果 a.size() != b.size(),否则线性
a != b可转换为 bool!(a == b)线性
a.swap(b)void交换 ab 的值常数[1][3]
swap(a, b)voida.swap(b)常数[1]
a.size()size_typestd::distance(a.begin(), a.end())常数[3]
a.max_size()size_typeb.size(),其中 b 是最大可能的容器常数[3]
a.empty()可转换为 boola.begin() == a.end()常量

备注

1 对于 std::array 为线性
2 对于 std::forward_list 始终为线性
3 并非严格常数 (直到 C++11)

给定

  • ij,容器迭代器类型的对象,

在表达式 i == ji != ji < ji <= ji >= ji > ji - j 中,其中一个或两个可以替换为引用同一元素的容器 const_iterator 类型的对象,且语义不变。

容器数据竞争

参见容器线程安全

其他要求

C

T

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 179C++98iterator 和 const_iterator 类型可能不可比较要求可比较
LWG 276C++98T 曾要求可复制赋值T 要求可复制构造
LWG 322C++98iterator 和 const_iterator 的值类型未指定指定为 T
LWG 774C++98没有关于 swap(a, b) 的要求已添加
LWG 2263C++11LWG 问题 179 的解决方案在 C++11 中被意外删除已恢复
LWG 2839C++11标准容器的自移动赋值不被允许允许,但结果未指定

C++ 命名要求: 容器

一个 容器 是一个用于存储其他对象并管理其所包含对象使用的内存的对象。

要求

  • T,一个元素类型;
  • C,一个包含类型为 T 的元素的 容器 类型;
  • ab,类型为 C 的对象;
  • rv,一个类型为 C 的纯右值表达式。

类型

名称类型要求
value_typeT可复制构造 (直到 C++11) 可擦除 (自 C++11 起)
referenceT&
const_referenceconst T&
iterator迭代器,其值类型为 T旧版前向迭代器 可转换为 const_iterator
const_iterator常量迭代器,其值类型为 TLegacyForwardIterator
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 = bC&销毁或从 b 的元素复制赋值 a 的所有元素后置条件:a == b线性
a = rv (自 C++11 起)C&销毁或从 rv 的元素移动赋值 a 的所有元素后置条件:如果 arv 不引用同一个对象,则 a 等于 rv 在此赋值之前的值线性
a.~C()void销毁 a 的所有元素并释放所有内存线性
a.begin()(const_)iterator指向 a 的第一个元素的迭代器常量
a.end()(const_)iterator指向 a 的最后一个元素之后一个位置的迭代器常量
a.cbegin() (自 C++11 起)const_iteratorconst_cast<const C&>(a).begin()常量
a.cend() (自 C++11 起)const_iteratorconst_cast<const C&>(a).end()常量
a == b可转换为 boola.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 必须是 可相等比较的常数[2] 如果 a.size() != b.size(),否则线性
a != b可转换为 bool!(a == b)线性
a.swap(b)void交换 ab 的值常数[1][3]
swap(a, b)voida.swap(b)常数[1]
a.size()size_typestd::distance(a.begin(), a.end())常数[3]
a.max_size()size_typeb.size(),其中 b 是最大可能的容器常数[3]
a.empty()可转换为 boola.begin() == a.end()常量

备注

1 对于 std::array 为线性
2 对于 std::forward_list 始终为线性
3 并非严格常数 (直到 C++11)

给定

  • ij,容器迭代器类型的对象,

在表达式 i == ji != ji < ji <= ji >= ji > ji - j 中,其中一个或两个可以替换为引用同一元素的容器 const_iterator 类型的对象,且语义不变。

容器数据竞争

参见容器线程安全

其他要求

C

T

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 179C++98iterator 和 const_iterator 类型可能不可比较要求可比较
LWG 276C++98T 曾要求可复制赋值T 要求可复制构造
LWG 322C++98iterator 和 const_iterator 的值类型未指定指定为 T
LWG 774C++98没有关于 swap(a, b) 的要求已添加
LWG 2263C++11LWG 问题 179 的解决方案在 C++11 中被意外删除已恢复
LWG 2839C++11标准容器的自移动赋值不被允许允许,但结果未指定