命名空间
变体
操作

C++ 命名需求: 容器

来自 cppreference.com
 
 
C++ 命名需求
 

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

内容

[编辑] 需求

[编辑] 图例

  • T,一个元素类型;
  • C,一个包含类型为 T 的元素的 容器 类型;
  • ab,类型为 C 的对象;
  • ij,(可能是 const)类型为 C::iterator 的值;
  • rv,类型为 C 的纯右值表达式。

[编辑] 成员类型

名称 类型 需求
C::value_type T 可复制构造(直到 C++11)可擦除(自 C++11)
C::reference T&
C::const_reference const T&
C::iterator 值类型T 的迭代器 传统前向迭代器
可转换为 const_iterator
C::const_iterator 值类型T 的常量迭代器 传统前向迭代器
C::difference_type 带符号整数 必须与 iteratorconst_iteratoriterator_traits::difference_type 相同
C::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 的所有元素 后置条件:如果 arv 不引用同一个对象,则 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() 常量
i <=> j
(自 C++20)
strong_ordering 容器迭代器的三路比较 C::​iterator 满足随机访问迭代器要求 常量
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 必须是 可相等比较 常量[2] 如果
a.size()
!=
b.size()
, 否则为线性
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 (自 C++11 起) 对于 std::arraystd::inplace_vector 为线性
  2. 对于 std::forward_list 始终为线性
  3. 3.0 3.1 3.2 (直到 C++11) 不是严格的常数

给定

  • ij,容器的 iterator 类型对象

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

[编辑] 可选容器要求 (自 C++20 起)

以下操作仅针对某些类型的容器提供。

如果传递给 std::lexicographical_compare_three_way 的迭代器满足 ConstexprIterator,则以下描述的操作由 constexpr 函数实现。

类别 描述
表达式 a <=> b
返回

std::lexicographical_compare_three_way(a.begin(), a.end(),
                                       b.begin(), b.end(),
                                       synth-three-way)

结果 synth-three-way-result<C::value_type>
先决条件 要么 T 符合 three_way_comparable,要么 < 针对 (可能是 const) 类型 T 的值定义,并且 < 是一个全序关系。
复杂度 线性

[编辑] 容器数据竞争

请参阅 容器线程安全性.

[编辑] 其他要求

C (容器)

T (类型)

[编辑] 缺陷报告

以下行为更改的缺陷报告被追溯应用到先前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 179 C++98 iteratorconst_iterator 类型可能无法比较 要求可比较
LWG 276 C++98 T 要求为 CopyAssignable T 要求为
可复制构造
LWG 322 C++98 未指定 iteratorconst_iterator 的值类型 指定为 T
LWG 774 C++98 未对 swap(a, b) 提出要求 添加了
LWG 883 C++98 a.swap(b) 被定义为 swap(a, b)
导致循环定义
定义为交换
ab 的值
LWG 1319 C++98 iteratorconst_iterator
可能没有多遍保证
要求满足
的要求
传统前向迭代器
LWG 2114
(P2167R3)
C++98 允许某些函数的非 bool 返回类型 不允许
LWG 2263 C++11 LWG 问题 179 的解决在 C++11 中意外被删除 恢复
LWG 2839 C++11 不允许标准容器的自移动赋值 允许但
结果未指定

[编辑] 另请参阅

C++ 文档 容器库