C++ 具名要求: AllocatorAwareContainer

来自cppreference.com
< cpp‎ | named req
 
 
 

具分配器容器 (AllocatorAwareContainer) 是保有分配器 (Allocator) 实例,并于其所有成员函数用该实例分配及解分配内存,于该内存构造及销毁对象的容器 (Container) (这种对象可以是容器元素、结点或对于无序容器为桶数组)。

下列规则应用到容器构造

  • 具分配器容器 (AllocatorAwareContainer) 的复制构造函数,通过在正在复制的容器的分配器上调用 std::allocator_traits<allocator_type>::select_on_container_copy_construction 获得其分配器实例。
  • 移动构造函数通过从属于旧容器的分配器移动构造,获得其分配器实例。
  • 所有其他构造函数接收一个分配器参数。

仅有的替换分配器的方式是移动赋值、复制赋值及交换:

  • 仅若 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_swapfalse ,则交换二个拥有不相等分配器的容器是未定义行为。

  • 访问器 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 交换 ab 的内容 常数

[编辑] 概念要求

A
T
X

[编辑] 注意

具分配器容器始终调用 std::allocator_traits<A>::construct(m, p, args)pargs 构造 A 类型对象,其中 m == get_allocator()std::allocator中默认的 construct 调用 ::new((void*)p) T(args) ,但特化的分配器可以选择不同的定义。

[编辑] 标准库

所有标准库容器,除了 std::array ,都是具分配器容器 (AllocatorAwareContainer) :

存储并操作字符序列
(类模板) [编辑]
双端队列
(类模板) [编辑]
(C++11 起)
单链表
(类模板) [编辑]
双链表
(类模板) [编辑]
动态的相接数组
(类模板) [编辑]
键值对的集合,按照键排序,键是唯一的
(类模板) [编辑]
键值对的集合,按照键排序
(类模板) [编辑]
唯一键的集合,按照键排序
(类模板) [编辑]
键的集合,按照键排序
(类模板) [编辑]
(C++11 起)
键值对的集合,按照键生成散列,键是唯一的
(类模板) [编辑]
(C++11 起)
唯一键的集合,按照键生成散列
(类模板) [编辑]
键值对的集合,按照键生成散列
(类模板) [编辑]
键的集合,按照键生成散列
(类模板) [编辑]