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

来自cppreference.com
< cpp‎ | named req


 
 
C++ 具名要求
 

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

要求

凡例

  • 元素类型 T
  • 包含 T 类型元素的容器 (Container) 类型 C
  • C 类型的对象 ab
  • (可能 const)的 C::iterator 类型的值 ij
  • C 类型的纯右值表达式 rv

成员类型

名称 类型 要求
C::value_type T 可复制构造 (CopyConstructible) (C++11 前)可擦除 (Erasable) (C++11 起)
C::reference T&
C::const_reference const T&
C::iterator 值类型T 的迭代器 老式向前迭代器 (LegacyForwardIterator)
可转换到 const_iterator
C::const_iterator 值类型T 的常迭代器 老式向前迭代器 (LegacyForwardIterator)
C::difference_type 有符号整数 必须与 iteratorconst_iteratoriterator_traits::difference_type 相同
C::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 的所有元素 后: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 必须可相等比较 (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::arraystd::inplace_vector 为线性
  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++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++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 179 C++98 iteratorconst_iterator 类型可能不可比较 要求可比较
LWG 276 C++98 T 要求 可复制赋值 (CopyAssignable) T 要求 可复制构造 (CopyConstructible)
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 不一定有多趟保证 它们需要满足
老式向前迭代器 (LegacyForwardIterator) 的要求
LWG 2114
(P2167R3)
C++98 曾允许某些函数的非 bool 返回类型 已禁止
LWG 2263 C++11 LWG 问题 179 的解决方案在 C++11 中被意外丢弃 已恢复
LWG 2839 C++11 不允许标准容器的自移动赋值 容许但结果未指定

参阅