Namespaces
Variants

C++ named requirements: Container

From cppreference.net
C++ named requirements

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

目录

要求

给定以下类型和值:

类型 定义
T 对象类型
C 包含类型为 T 的对象的容器类
定义
u , v 类型为 C const C 的值
mv 类型为 C 的值
cv 类型为 const C 的值
lhs , rhs 类型为 C 的左值
i , j 类型为 C::iterator const C :: iterator 的值

C 满足 Container 要求,当以下类型、语句和表达式具有良构性且符合指定语义时:

类型

类型 定义 要求
typename C :: value_type T T 需满足 CopyConstructible (C++11 前) Erasable C (C++11 起)
typename C :: reference T& 无显式要求
typename C :: const_reference const T &
typename C :: iterator 迭代器类型
typename C :: const_iterator 常量迭代器类型 C::const_iterator 需为 LegacyForwardIterator ,且其 值类型 T
typename C :: difference_type 有符号整数类型 C::difference_type 需与 C::iterator C::const_iterator 差值类型 相同。
typename C :: size_type 无符号整数类型 C::size_type 需足够大以表示 C::difference_type 的所有非负值。

语句

语句 语义 复杂度
C c ;

C c = C ( ) ;

后置条件 c. empty ( ) true 常数时间
C c ( v ) ;

C c = C ( v ) ;

前置条件

v 不是类型 C 的右值, T 必须为 CopyInsertable C

(C++11 起)
线性时间 [1]
后置条件
  • v 是左值,则 c == v true
  • v 是右值 ,且 c v 不指向同一对象 (C++11 起) ,则 c 等于构造前 v 的值。
注释
  1. v 是类型 C 的右值,且 C 不是 std::array std::inplace_vector 的特化,则复杂度为常数时间。

表达式

表达式 类型 语义 复杂度
C ( ) C 后置条件 C ( ) . empty ( ) true 常数复杂度
C ( v ) C 前置条件

v 不是类型 C 的右值, T 必须为可复制插入 CopyInsertable C 的类型。

(C++11 起)
常数复杂度 [1]
后置条件
  • v 为左值,则 C ( v ) == v true
  • v 为右值 ,且 C ( v ) v 不指向同一对象 (C++11 起) ,则 C ( v ) 等于构造前 v 所具有的值。
lhs = v C& 后置条件
  • v 为左值,则 lhs == v true
  • v 为右值 ,且 lv v 不指向同一对象 (C++11 起) ,则 lhs 等于此赋值前 v 所具有的值。
线性
v.~C ( ) void 效果 销毁 v 的所有元素并释放已申请的所有内存。 线性
mv. begin ( ) C::iterator 效果 返回指向 mv 首个元素的迭代器 常量性
cv. begin ( ) C::const_iterator 效果 返回指向 cv 首元素的迭代器 常量性
mv. end ( ) C::iterator 效果 返回 mv 的尾后迭代器 常量复杂度
cv. end ( ) C::const_iterator 效果 返回 cv 的尾后迭代器。 常量
v. cbegin ( )
(C++11 起)
C::const_iterator 效果 返回 const_cast < const C & > ( v ) . begin ( ) 常量
v. cend ( )
(C++11 起)
C::const_iterator 效果 返回 const_cast < const C & > ( v ) . end ( ) 常量
i <=> j
(自 C++20 起)
std::strong_ordering 约束条件 仅当 C::iterator 满足随机访问迭代器要求时,此表达式才需要具有良构性。 常数复杂度
u == v bool 效果 返回
u. size ( ) == v. size ( ) &&
std:: equal ( u. begin ( ) ,
u. end ( ) , v. begin ( ) )
(C++14 前)
std:: equal ( u. begin ( ) , u. end ( ) ,
v. begin ( ) , v. end ( ) )
(C++14 起)
线性 [2]
u ! = v 效果 等价于 ! ( u == v )
lhs. swap ( rhs )

swap ( lhs, rhs )

void 效果 交换 lhs rhs 的内容 常数复杂度 [3]
v. size ( ) C::size_type 效果 返回 v 的元素数量 [4] 常数时间复杂度
v. max_size ( ) C::size_type 效果 返回类型为 C 的容器可能包含的最大元素数量。 常数复杂度
v. empty ( ) bool 效果 返回 v. begin ( ) == v. end ( ) 常数复杂度
可选容器要求
(仅针对某些容器类型提供)
u <=> v
(C++20 起)
synth-three-way-result
< C :: value_type >
前置条件 需满足 T 实现 three_way_comparable 概念,或 operator < T const T 类型值定义全序关系 线性复杂度
效果 返回 std:: lexicographical_compare_three_way
( u. begin ( ) , u. end ( ) ,
v. begin ( ) , v. end ( ) ,
synth-three-way  )
[5]
注释
  1. 如果 v 是类型 C 的右值,且 C std::array std::inplace_vector 的特化,则复杂度为线性。
  2. 如果 u. size ( ) ! = v. size ( ) true ,则复杂度为常数。
  3. 如果 C std::array std::inplace_vector 的特化,则复杂度为线性。
  4. 元素数量由构造函数、插入和擦除操作的规则定义。其值等于 std:: distance ( v. begin ( ) , v. end ( ) )
  5. 如果传递给 std::lexicographical_compare_three_way 的迭代器是 ConstexprIterator 类型 ,则该操作通过 constexpr 函数实现。

在表达式 i == j i ! = j i < j i <= j i >= j i > j 以及 i - j 中,若将 i 和/或 j 替换为指向同一元素的 C::const_iterator 类型迭代器,其语义保持不变。

容器数据竞争

参见 容器线程安全性

缺陷报告

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

缺陷报告 适用标准 已发布行为 正确行为
LWG 179 C++98 iterator const_iterator 类型可能不可比较 要求必须可比较
LWG 276 C++98 T 被要求为 CopyAssignable T 被要求为
CopyConstructible
LWG 322 C++98 iterator const_iterator 的值类型未指定 指定为 T
LWG 774 C++98 swap ( a, b ) 没有要求 已添加
LWG 883 C++98 a. swap ( b ) 被定义为 swap ( a, b )
导致循环定义
定义为交换
a b 的值
LWG 1319 C++98 iterator const_iterator
可能不具备多遍遍历保证
要求它们满足
以下概念的要求:
LegacyForwardIterator
LWG 2114
( P2167R3 )
C++98 某些函数的非 bool 返回类型被允许 已禁止
LWG 2182 C++98 reference
const_reference 表示的类型规范不完善
改进了措辞
LWG 2257 C++98 两个容器比较相等时需要线性时间,
即使它们的大小不同
此种情况下仅需
常数时间
LWG 2263 C++11 LWG 问题 179 的解决方案在 C++11 中意外丢失 已恢复
LWG 2839 C++11 标准容器的自移动赋值不被允许 允许但
结果未指定
N3346 C++11 C::value_type 被要求为 Destructible 被要求为 Erasable C

另请参阅

C++ 文档 关于 容器库