C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- C++ 具名要求: 函数对象 (FunctionObject)
- C++ 具名要求: 二元谓词 (BinaryPredicate)
- C++ 具名要求: 可默认构造 (DefaultConstructible)
- C++ 具名要求: 可复制赋值 (CopyAssignable)
- C++ 具名要求: 可复制构造 (CopyConstructible)
- C++ 具名要求: 可移动赋值 (MoveAssignable) (C++11 起)
- C++ 具名要求: 可移动构造 (MoveConstructible) (C++11 起)
- C++ 具名要求: 可析构 (Destructible)
- C++ 具名要求: 可平凡复制 (TriviallyCopyable)
- C++ 具名要求: 可相等比较 (EqualityComparable)
- C++ 具名要求: 可小于比较 (LessThanComparable)
- C++ 具名要求: 比较 (Compare)
- C++ 具名要求: 字面类型 (LiteralType)
- C++ 具名要求: 简旧数据类型 (PODType)
- C++ 具名要求: 平凡类型 (TrivialType)
- C++ 具名要求: 标准布局类型 (StandardLayoutType)
- C++ 具名要求: 遗留向前迭代器 (LegacyForwardIterator)
- C++ 具名要求: 可交换 (Swappable)
- C++ 具名要求: 值可交换 (ValueSwappable)
- C++ 具名要求: 可空指针 (NullablePointer) (C++11 起)
- C++ 具名要求: 散列 (Hash)
- C++ 具名要求: 分配器 (Allocator)
- C++ 具名要求: 可调用 (Callable)
- C++ 具名要求: 谓词 (Predicate)
- C++ 具名要求: 容器 (Container)
- C++ 具名要求: 序列容器 (SequenceContainer)
- C++ 具名要求: 连续容器 (ContiguousContainer)
- C++ 具名要求: 可逆容器 (ReversibleContainer)
- C++ 具名要求: 关联容器 (AssociativeContainer)
- C++ 具名要求: 具分配器容器 (AllocatorAwareContainer)
- C++ 具名要求: 无序关联容器 (UnorderedAssociativeContainer)
- C++ 具名要求: 可默认插入 (DefaultInsertable)
- C++ 具名要求: 可复制插入 (CopyInsertable)
- C++ 具名要求: 可移动插入 (MoveInsertable) (C++11 起)
- C++ 具名要求: 可就位构造 (EmplaceConstructible) (C++11 起)
- C++ 具名要求: 可擦除 (Erasable)
- C++ 具名要求: 遗留迭代器 (LegacyIterator)
- C++ 具名要求: 遗留输出迭代器 (LegacyOutputIterator)
- C++ 具名要求: 遗留输入迭代器 (LegacyInputIterator)
- C++ 具名要求: 遗留双向迭代器 (LegacyBidirectionalIterator)
- C++ 具名要求: 遗留随机访问迭代器 (LegacyRandomAccessIterator)
- C++ 具名要求: 遗留连续迭代器 (LegacyContiguousIterator)
- C++ 具名要求: 常量表达式迭代器 (ConstexprIterator)
- C++ 具名要求: 有格式输入函数 (FormattedInputFunction)
- C++ 具名要求: 无格式输入函数 (UnformattedInputFunction)
- C++ 具名要求: 有格式输出函数 (FormattedOutputFunction)
- C++ 具名要求: 无格式输出函数 (UnformattedOutputFunction)
- C++ 具名要求: 种子序列 (SeedSequence)
- C++ 具名要求: 随机数引擎 (RandomNumberEngine)
- C++ 具名要求: 随机数分布 (RandomNumberDistribution)
- C++ 具名要求: 均匀随机位生成器 (UniformRandomBitGenerator)
- C++ 具名要求: 随机数引擎适配器 (RandomNumberEngineAdaptor)
- C++ 具名要求: 基本可锁定 (BasicLockable)
- C++ 具名要求: 可锁定 (Lockable)
- C++ 具名要求: 可定时锁定 (TimedLockable)
- C++ 具名要求: 互斥体 (Mutex)
- C++ 具名要求: 定时互斥体 (TimedMutex)
- C++ 具名要求: 共享互斥体 (SharedMutex)
- C++ 具名要求: 共享定时互斥体 (SharedTimedMutex)
- C++ 具名要求: 字符特征 (CharTraits)
- C++ 具名要求: 正则表达式特征 (RegexTraits)
- C++ 具名要求: 位掩码类型 (BitmaskType)
- C++ 具名要求: 数值类型 (NumericType)
- C++ 具名要求: 一元类型特征 (UnaryTypeTrait)
- C++ 具名要求: 二元类型特征 (BinaryTypeTrait)
- C++ 具名要求: 变换特征 (TransformationTrait)
- C++ 具名要求: 时钟 (Clock)
- C++ 具名要求: 平凡时钟 (TrivialClock)
- 注释
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
C++ 具名要求: 序列容器 (SequenceContainer)
序列容器 (SequenceContainer) 是在线性排列中存储相同类型对象的容器 (Container) 。
要求
以下情况下,类型 X
满足序列容器 (SequenceContainer)
- 类型
X
满足容器 (Container) ,且
给定
-
T
,为X
的元素类型 -
A
,为X
的分配器类型:若存在则为 X::allocator_type,否则为 std::allocator<T> -
a
,为X
类型的左值表达式 -
p
,a
中的有效常量迭代器 -
q
,a
中的有效可解引用常量迭代器 -
q1
与q2
,为a
中的两个有效常量迭代器,并使得 [q1, q2) 是有效范围 -
i
与j
,为遗留输入迭代器 (LegacyInputIterator) ,使得 [i, j) 是有效范围,且各迭代器指代能隐式转换成value_type
的对象 -
il
,为 std::initializer_list<value_type> 类型的对象 -
n
,为 X::size_type 类型的值 -
t
,为 X::value_type 类型的左值或 const 右值 -
rv
,为 X::value_type 类型的非 const 右值 -
Args
:模板形参包 -
args
:拥有模式 Arg&& 的函数形参包
下列表达式必须合法,且对除 std::array 之外的所有顺序容器均具有所指定的效果:
表达式 | 返回类型 | 效果 | 前条件 | 后条件 |
---|---|---|---|---|
X(n, t)
X a(n, t) |
构造保有 n 个 t 的副本的容器
|
T 可复制插入 (CopyInsertable) 到 X
|
std::distance(begin(),end()) == n | |
X(i, j)
X a(i, j) |
构造与范围 [i,j) 逐元素相等的顺序容器
|
T 从 *i 可就位构造 (EmplaceConstructible) 到 X 中
(仅对 std::vector)若各迭代器不是遗留向前迭代器 (LegacyForwardIterator) ,则 |
std::distance(begin(),end()) == std::distance(i,j) | |
X(il) | X(il.begin(), il.end()) | |||
a = il | X& | 将 il 所表示的范围赋值到 a 中[1]
|
T 可复制插入 (CopyInsertable) 且可复制赋值 (CopyAssignable)
|
a 的既存元素被销毁或被赋值
|
a.emplace(p,args) | iterator
|
在 p 前插入以 std::forward<Args>(args) 构造的 T 类型的对象
|
T 可复制插入 (CopyInsertable)
(对 std::vector 与 std::deque) |
返回指向由 args 构造到 a 中的元素的迭代器
|
a.insert(p,t) | iterator
|
在 p 前插入 t 的副本
|
T 可复制插入 (CopyInsertable)
(对 std::vector 与 std::deque) |
返回指向插入到 a 中的 t 的副本的迭代器
|
a.insert(p,rv) | iterator
|
在 p 前插入 rv 的副本,可能用移动语义
|
T 可移动插入 (MoveInsertable)
(对 std::vector 与 std::deque) |
返回指向插入到 a 中的 rv 的副本的迭代器
|
a.insert(p,n,t) | iterator |
插入 n 个 t 的副本到 p 之前
|
T 可复制插入 (CopyInsertable) 且可复制赋值 (CopyAssignable)
|
返回指向插入到 a 中的首元素的副本的迭代器,或当 n==0 时为 p
|
a.insert(p,i,j) | iterator |
插入 [i, j) 中元素的副本到 p 之前
|
T 可就位构造 (EmplaceConstructible) 且 i 与 j 不在 a 中
(仅对 std::vector)若迭代器不是遗留向前迭代器 (LegacyForwardIterator) ,则 |
[i,j) 中的每个迭代器被解引用一次。返回指向插入到 a 的首元素的副本的迭代器,或当 i==j 时为 p
|
a.insert(p, il) | iterator |
a.insert(p,il.begin(),il.end()) | 返回指向插入到 a 中的首元素的副本的迭代器,或若 il 为空则为 p 。
| |
a.erase(q) | iterator |
擦除 q 所指向的元素
|
(std::deque, std::vector) T 可移动赋值 (MoveAssignable)
|
返回指向擦除前紧跟 q 之后的元素的迭代器,或若此种元素不存在则返回 a.end()。
|
a.erase(q1,q2) | iterator |
擦除 [q1,q2) 中的元素 |
(std::deque, std::vector) T 可移动赋值 (MoveAssignable) |
返回指向在任何擦除前 q2 曾指向的元素的迭代器,或若不存在此种元素则返回 a.end()。
|
a.clear() | void |
销毁 a 中所有元素 |
所有引用、指针及迭代器均失效,包含尾迭代器。a.empty() == true。 | |
a.assign(i,j) | void |
以 [i, j) 的副本替换 a 中的元素
|
T 可就位构造 (EmplaceConstructible) ,且 i 、j 不在 a 中
(std::vector),若非遗留向前迭代器 (LegacyForwardIterator) ,则 |
[i,j) 中的每个迭代器被解引用一次
|
a.assign(il) | void |
a.assign(il.begin(),il.end()) | ||
a.assign(n,t) | void
|
用 t 的 n 个副本替换 a 中的元素
|
T 可复制插入 (CopyInsertable) 并可复制赋值 (CopyAssignable)
|
|
注 | ||||
|
下列表达式必须合法,且对于所指名的顺序容器拥有所指定的效果:
表达式 | 返回类型 | 效果 | 前条件 | 容器 |
---|---|---|---|---|
a.front() | reference
对于 const a 为 |
等价于 *a.begin() | (全部) | |
a.back() | reference
对于 const a 为 |
等价于 { auto tmp = a.end(); --tmp; return *tmp; } | std::basic_string std::array std::deque std::list std::vector | |
a.emplace_front(args) | void
|
前附一个以 std::forward<Args>(args)... 构造的 T
|
T 从 args 可就位构造 (EmplaceConstructible) 到 X 中
|
std::deque std::forward_list std::list |
a.emplace_back(args) | void
|
后附一个以 std::forward<Args>(args)... 构造的 T
|
T 从 args 可就位构造 (EmplaceConstructible) 到 X 中
(仅 std::vector) |
std::deque std::list std::vector |
a.push_front(t) | void
|
前附 t 的一个副本
|
T 可复制插入 (CopyInsertable) 到 X 中
|
std::deque std::forward_list std::list |
a.push_front(rv) | void
|
前附 rv 的一个副本,可能用移动语义
|
T 可移动插入 (MoveInsertable) 到 X 中
|
std::deque std::forward_list std::list |
a.push_back(t) | void
|
后附 t 的一个副本
|
T 可复制插入 (CopyInsertable) 到 X 中
|
std::basic_string std::deque std::list std::vector |
a.push_back(rv) | void
|
后附 rv 的一个副本,可能用移动语义
|
T 可移动插入 (MoveInsertable) 到 X 中
|
std::basic_string std::deque std::list std::vector |
a.pop_front() | void
|
销毁首元素 | a.empty() == false | std::deque std::forward_list std::list |
a.pop_back() | void
|
销毁最末元素 | a.empty() == false | std::basic_string std::deque std::list std::vector |
a[n] | reference
对于 const a 为 |
等价于 *(n + a.begin()) | std::basic_string std::array std::deque std::vector | |
a.at(n) | reference
对于 const a 为 |
等价于 *(n + a.begin()),但若 n>=size() 则抛出 out_of_range | std::basic_string std::array std::deque std::vector |
另外,对于每个顺序容器,接收两个输入迭代器的构造函数模板和成员函数 insert()
、append()
、assign()
、replace()
的模板重载,若相应的模板实参不满足遗留输入迭代器 (LegacyInputIterator) ,则它们不参与重载决议。
标准库中的顺序容器
存储并操作字符序列 (类模板) | |
(C++11 起) |
静态的连续数组 (类模板) |
动态的连续数组 (类模板) | |
双端队列 (类模板) | |
(C++11 起) |
单链表 (类模板) |
双链表 (类模板) |
权衡/使用备注
std::array | 快速访问但元素数量固定 |
std::vector | 快速访问但大多情况在插入/删除低效 |
std::list std::forward_list |
在序列中部高效地插入/删除 |
std::deque | 在序列首尾高效地插入/删除 |