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
满足
容器
的要求,若以下类型、语句和表达式均良构且具有指定语义:
类型
| 类型 | 定义 | 要求 |
|---|---|---|
| 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 ) ; |
前置条件 |
|
线性复杂度 [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
的最大可能
|
|||||
在表达式
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++ 文档
关于
容器库
|