C++ named requirements: Container
一个 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 ) ; |
前置条件 |
|
线性时间 [1] | ||
| 后置条件 |
|
||||
| 注释 | |||||
|
|||||
表达式
| 表达式 | 类型 | 语义 | 复杂度 | |||||
|---|---|---|---|---|---|---|---|---|
| C ( ) |
C
|
后置条件 | C ( ) . empty ( ) 为 true 。 | 常数复杂度 | ||||
| C ( v ) |
C
|
前置条件 |
|
常数复杂度 [1] | ||||
| 后置条件 |
|
|||||||
| lhs = v |
C&
|
后置条件 |
|
线性 | ||||
| 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 | 效果 |
返回
|
线性 [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]
。
|
|||||||
| 注释 | ||||||||
|
||||||||
在表达式
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++ 文档
关于
容器库
|