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++ 具名要求: 具分配器容器 (AllocatorAwareContainer)
具分配器容器 (AllocatorAwareContainer) 是容器 (Container) ,其保有一个分配器 (Allocator) 实例,并于其所有成员函数中用该实例来分配及解分配内存,并于这个内存中构造及销毁对象的(这种对象可以是容器元素,结点,或对于无序容器为桶数组)。
下列规则适用于容器的构造
- 具分配器容器 (AllocatorAwareContainer) 的复制构造函数,通过在正在复制的容器的分配器上调用 std::allocator_traits<allocator_type>::select_on_container_copy_construction 获得自己的分配器实例。
- 移动构造函数通过从属于旧容器的分配器进行移动构造,获得其自己的分配器实例。
- 所有其他构造函数均接收一个分配器形参。
仅有的替换分配器的方式是进行移动赋值、复制赋值及交换:
- 仅当 std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value 为 true 时,复制赋值才会替换分配器
- 仅当 std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value 为 true 时,移动赋值才会替换分配器
- 仅当 std::allocator_traits<allocator_type>::propagate_on_container_swap::value 为 true 时,交换才会替换分配器。特别是它将通过对非成员函数 swap 的无限定的调用来交换分配器实例,见可交换 (Swappable) 。
注:若 propagate_on_container_swap
为 false,则交换两个拥有不相等分配器的容器是未定义行为。
- 访问器
get_allocator()
获得构造容器时所用的,或为最近的分配器替换操作所安装的分配器的一个副本。
要求
凡例 | |
X
|
容器类型 |
T
|
元素类型 |
A
|
T 的分配器
|
a , b
|
X 类型的对象(非 const 左值)
|
t
|
X 类型的对象(左值或 const 右值)
|
rv
|
X 类型的对象(非 const 右值)
|
m
|
A 类型的对象
|
Q
|
分配器类型 |
表达式 | 返回类型 | 前提/要求 | 后置/效应 | 复杂度 |
---|---|---|---|---|
allocator_type | A |
allocator_type::value_type 必须与 X::value_type 相同 | 编译时 | |
get_allocator() | A |
常数 | ||
X u; | A 可默认构造 (DefaultConstructible) |
u.empty() == true && u.get_allocator() == A() | 常数 | |
X u(m); | u.empty() == true && u.get_allocator() == m | 常数 | ||
X u(t,m); | T 可复制插入 (CopyInsertable) 到 X
|
u == t && u.get_allocator() == m | 线性 | |
X u(rv); | A 的移动构造函数必须不抛异常
|
u 拥有与 rv 构造前相同的元素和相等的分配器 |
常数 | |
X u(rv,m); | T 可移动插入 (MoveInsertable) 到 X
|
u 的元素与 rv 的相同或是其副本,且 u.get_allocator() == m
|
若 m == rv.get_allocator() 则为常数,否则为线性 | |
a = t | X& | T 可复制插入 (CopyInsertable) 到 X 且可复制赋值 (CopyAssignable) |
a == t | 线性 |
a = rv | X& | 若分配器将不被移动赋值所替换(见上文),则 T 可移动插入 (MoveInsertable) 到 X 并可移动赋值 (MoveAssignable)
|
a 的所有既存元素被移动赋值或销毁;a 等于 rv 赋值前所拥有的值 |
线性 |
a.swap(b) | void | 交换 a 与 b 的内容 |
常数 |
概念要求
- A
- T
- X
注解
具分配器容器始终调用 std::allocator_traits<A>::construct(m, p, args) 在 p
中用 args
来构造一个 A
类型的对象,其中 m == get_allocator()。std::allocator 中默认的 construct
调用 ::new((void*)p) T(args),但特化的分配器可以选择不同的定义。
标准库
所有标准库容器,除了 std::array,都是具分配器容器 (AllocatorAwareContainer) :