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

来自cppreference.com
< cpp‎ | named req
 
 
C++ 具名要求
基础
类型属性
库所属
容器
容器元素
(C++11)

迭代器
流 I/O
格式化
(C++20)
随机数
(C++11)    
并发
(C++11)
(C++11)
范围
其他
(C++11)


 

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

要求

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

类型

名称 类型 要求
value_type T 可复制构造 (CopyConstructible) (C++11 前)可擦除 (Erasable) (C++11 起)
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++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() 常数
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++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
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 2263 C++11 LWG 问题 179 的解决方案在 C++11 中被意外丢弃 已恢复
LWG 2839 C++11 不允许标准容器的自移动赋值 容许但结果未指定

参阅