命名空间
变体
操作

C++ 命名要求: AllocatorAwareContainer (自 C++11 起)

来自 cppreference.cn
 
 
C++ 命名要求
基本
类型属性
全库范围




Container(容器)
AllocatorAwareContainer(分配器感知容器)
容器元素
迭代器 (Iterator)
流 I/O
格式化器
(C++20)
随机数
并发
(C++11)
Ranges
多维视图
其他

 

AllocatorAwareContainer 是一个 Container,它持有 Allocator 的实例,并在其所有成员函数中使用该实例来分配和释放内存,以及在该内存中构造和销毁对象(这些对象可以是容器元素、节点,或者对于无序容器,可以是桶数组),但 std::basic_string 特化类型不使用分配器来构造/销毁其元素(自 C++23 起)

以下规则适用于容器构造:

  • AllocatorAwareContainer 的复制构造函数通过调用被复制容器的分配器上的 std::allocator_traits<allocator_type>::select_on_container_copy_construction 来获取其分配器实例。
  • 移动构造函数通过从旧容器所属的分配器进行移动构造来获取其分配器实例。
  • 所有其他构造函数都接受一个 const allocator_type& 参数。

替换分配器的唯一方法是复制赋值、移动赋值和交换。

  • 仅当 std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::valuetrue 时,复制赋值才会替换分配器。
  • 仅当 std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::valuetrue 时,移动赋值才会替换分配器。
  • 仅当 std::allocator_traits<allocator_type>::propagate_on_container_swap::valuetrue 时,交换才会替换分配器。具体来说,它将通过对非成员函数 swap 的非限定调用来交换分配器实例,参见 Swappable

注意:如果 `propagate_on_container_swap` 为 false,则交换两个分配器不相等的容器的行为是未定义的。

  • 访问器 `get_allocator()` 获取用于构造容器或通过最近的分配器替换操作安装的分配器的副本。

目录

[编辑] 要求

如果一个类型满足 Container 并且给定以下类型和值,则它满足 AllocatorAwareContainer 的语义和复杂性要求,如下表所示:

类型 定义
X 一个 AllocatorAwareContainer 类型
T Xvalue_type
A X 使用的分配器类型
定义
a, b 类型为 X 的非 const 左值
c 类型为 const X 的左值
t 类型为 X 的左值或 const 右值
rv 类型为 X 的非 const 右值
m 类型为 A 的值

[编辑] 类型

名称  类型  要求
typename X::allocator_type  A X::allocator_type::value_typeX::value_type 相同。

[编辑] 语句

语句 语义 复杂度
X u;
X u = X();
前置条件 ADefaultConstructible 常量
后置条件  u.empty()u.get_allocator() == A() 都为 true
X u(m); 后置条件 u.empty()u.get_allocator() == m 都为 true 常量
X u(t, m); 前置条件 TCopyInsertableX 中。 线性
后置条件 u == tu.get_allocator() == m 都为 true
X u(rv); 后置条件
  • u 拥有与此构造之前 rv 相同的元素。
  • u.get_allocator() 的值与此构造之前 rv.get_allocator() 的值相同。
常量
X u(rv, m); 前置条件 TMoveInsertableX 中。
  • 如果 m == rv.get_allocator()true,则为常量。
  • 否则为线性。
后置条件
  • u 拥有与此构造之前 rv 相同的元素或元素的副本。
  • u.get_allocator() == mtrue

[编辑] 表达式

表达式  类型  语义  复杂度 
c.get_allocator() A 无直接语义要求。 常量
a = t X& 前置条件 TCopyInsertableX 中并可 CopyAssignable 线性
后置条件  a == ttrue
a = rv X& 前置条件 如果分配器不会被移动赋值替换(参见上方),则 TMoveInsertableX 中并可 MoveAssignable 线性
效果 a 的所有现有元素要么被移动赋值,要么被销毁。
后置条件 如果 arv 不指向同一对象,则 a 等于赋值之前 rv 的值。
a.swap(b) void 效果 交换 ab 的内容。 常量

[编辑] 注意

AllocatorAwareContainers 总是调用 std::allocator_traits<A>::construct(m, p, args) 来在 p 处构造类型为 T 的对象,使用 args,其中 m == get_allocator()std::allocator 中的默认 construct 调用 ::new((void*)p) T(args)(直到 C++20)std::allocator 没有 construct 成员,并且在构造元素时调用 std::construct_at(p, args)(自 C++20 起),但专门的分配器可以选择不同的定义。

[编辑] 标准库

所有标准库字符串类型和容器(除了 std::arraystd::inplace_vector)都是 AllocatorAwareContainer

存储和操作字符序列
(类模板) [编辑]
双端队列
(类模板) [编辑]
单向链表
(类模板) [编辑]
双向链表
(类模板) [编辑]
可变大小的连续数组
(类模板) [编辑]
键值对集合,按键排序,键唯一
(类模板) [编辑]
键值对的集合,按键排序
(类模板) [编辑]
唯一键的集合,按键排序
(类模板) [编辑]
键的集合,按键排序
(类模板) [编辑]
键值对的集合,按键哈希,键是唯一的
(类模板) [编辑]
键值对集合,按键哈希
(类模板) [编辑]
由键哈希的唯一键集合
(类模板) [编辑]
键的集合,按键哈希
(类模板) [编辑]

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 2839 C++11 标准容器的自移动赋值不被允许 允许但结果未指定