Namespaces
Variants

C++ named requirements: Container

From cppreference.net
C++ named requirements

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

目录

要求

给定以下类型和值:

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

C 满足 容器 的要求,若以下类型、语句和表达式均良构且具有指定语义:

类型

类型 定义 要求
typename C :: value_type T T 需满足 可复制构造 (C++11 前) 可从 C 擦除 (C++11 起)
typename C :: reference T& 无显式要求
typename C :: const_reference const T &
typename C :: iterator 迭代器类型
typename C :: const_iterator 常量迭代器类型 C::const_iterator 需为 前向迭代器 ,且其 值类型 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 必须为 可复制插入 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 的最大可能

在表达式 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 要求可从 C Erasable

另请参阅

C++ 文档 关于 容器库