scoped_allocator_adaptor 类
表示分配器嵌套。
语法
template <class Outer, class... Inner>
class scoped_allocator_adaptor;
备注
这个类模板封装了一个或多个分配器的嵌套。 每个这样的类都具有一个类型为 outer_allocator_type
的最外层分配器,该类型也即 Outer
,是 scoped_allocator_adaptor
对象的公共基类。 Outer
可用于分配容器要使用的内存。 通过调用 outer_allocator
可获取对此分配器基对象的引用。
嵌套的其余部分具有 inner_allocator_type
类型。 内部分配器用于为容器中的元素分配内存。 通过调用 inner_allocator
可获取对此类型的存储对象的引用。 如果 Inner...
不为空,则 inner_allocator_type
将具有类型 scoped_allocator_adaptor<Inner...>
,inner_allocator
指示成员对象。 否则,inner_allocator_type
将具有类型 scoped_allocator_adaptor<Outer>
,inner_allocator
指示整个对象。
嵌套的表现行为好像可以具有任意深度,可根据需要复制其最里层的封装分配器。
可借助界面中不可见的几个概念来帮助理解这个类模板的行为。 最外层分配器,可协调对构造和销毁方法的所有调用。 它实际上是由递归函数 OUTERMOST(X)
定义的,其中 OUTERMOST(X)
是以下项之一。
如果
X.outer_allocator()
的格式正确,则OUTERMOST(X)
为OUTERMOST(X.outer_allocator())
。否则
OUTERMOST(X)
为X
。
需要定义三种类型以便进行展示:
类型 | 描述 |
---|---|
Outermost |
OUTERMOST(*this) 的类型。 |
Outermost_traits |
allocator_traits<Outermost> |
Outer_traits |
allocator_traits<Outer> |
构造函数
名称 | 描述 |
---|---|
scoped_allocator_adaptor | 构造 scoped_allocator_adaptor 对象。 |
Typedef
名称 | 描述 |
---|---|
const_pointer |
此类型是 const_pointer (与分配器 Outer 关联)的同义词。 |
const_void_pointer |
此类型是 const_void_pointer (与分配器 Outer 关联)的同义词。 |
difference_type |
此类型是 difference_type (与分配器 Outer 关联)的同义词。 |
inner_allocator_type |
此类型是嵌套适配器 scoped_allocator_adaptor<Inner...> 类型的同义词。 |
outer_allocator_type |
此类型是基本分配器 Outer 类型的同义词。 |
pointer |
此类型是 pointer (与分配器 Outer 关联)的同义词。 |
propagate_on_container_copy_assignment |
仅当 Outer_traits::propagate_on_container_copy_assignment 或 inner_allocator_type::propagate_on_container_copy_assignment 为 true 时,该类型才为 true。 |
propagate_on_container_move_assignment |
仅当 Outer_traits::propagate_on_container_move_assignment 或 inner_allocator_type::propagate_on_container_move_assignment 为 true 时,该类型才为 true。 |
propagate_on_container_swap |
仅当 Outer_traits::propagate_on_container_swap 或 inner_allocator_type::propagate_on_container_swap 为 true 时,该类型才为 true。 |
size_type |
此类型是 size_type (与分配器 Outer 关联)的同义词。 |
value_type |
此类型是 value_type (与分配器 Outer 关联)的同义词。 |
void_pointer |
此类型是 void_pointer (与分配器 Outer 关联)的同义词。 |
结构
名称 | 描述 |
---|---|
scoped_allocator_adaptor::rebind 结构 | 将 Outer::rebind\<Other>::other 类型定义为 scoped_allocator_adaptor\<Other, Inner...> 的同义词。 |
方法
名称 | 描述 |
---|---|
allocate | 通过使用 Outer 分配器分配内存。 |
construct | 构造 对象。 |
deallocate | 通过使用外部分配器释放对象。 |
destroy | 销毁指定的对象。 |
inner_allocator | 检索对类型为 inner_allocator_type 的存储对象的引用。 |
max_size | 确定可通过外部分配器分配的对象的最大数目。 |
outer_allocator | 检索对类型为 outer_allocator_type 的存储对象的引用。 |
select_on_container_copy_construction | 创建一个新的 scoped_allocator_adaptor 对象,其中每个存储分配器对象都可通过调用每个相应分配器的 select_on_container_copy_construction 进行初始化。 |
运算符
运算符 | 说明 |
---|---|
operator= | |
operator== | |
operator!= |
要求
标头:<scoped_allocator>
命名空间: std
scoped_allocator_adaptor::allocate
通过使用 Outer
分配器分配内存。
pointer allocate(size_type count);pointer allocate(size_type count, const_void_pointer hint);
参数
count
要分配足够的存储空间的元素数量。
hint
通过定位在请求之前分配的对象地址,指针可能对分配器对象有所帮助。
返回值
第一个成员函数返回 Outer_traits::allocate(outer_allocator(), count)
。 第二个成员函数返回 Outer_traits::allocate(outer_allocator(), count, hint)
。
scoped_allocator_adaptor::construct
构造 对象。
template <class Ty, class... Atypes>
void construct(Ty* ptr, Atypes&&... args);
template <class Ty1, class Ty2, class... Atypes1, class... Atypes2>
void construct(pair<Ty1, Ty2>* ptr, piecewise_construct_t,
tuple<Atypes1&&...>
first, tuple<Atypes1&&...> second);
template <class Ty1, class Ty2>
void construct(pair<Ty1, Ty2>* ptr);
template <class Ty1, class Ty2, class Uy1, class Uy2>
void construct(pair<Ty1, Ty2>* ptr,
class Uy1&& first, class Uy2&& second);
template <class Ty1, class Ty2, class Uy1, class Uy2>
void construct(pair<Ty1, Ty2>* ptr, const pair<Uy1, Uy2>& right);
template <class Ty1, class Ty2, class Uy1, class Uy2>
void construct(pair<Ty1, Ty2>* ptr, pair<Uy1, Uy2>&& right);
参数
ptr
指向要构造对象的内存位置的指针。
args
参数列表。
first
属于一对中第一种类型的对象。
second
属于一对中第二种类型的对象。
right
要移动或复制的现有对象。
备注
第一种方法通过调用 Outermost_traits::construct(OUTERMOST(*this), ptr, xargs...)
在 ptr 处构造对象,其中 xargs...
是以下项之一。
如果
uses_allocator<Ty, inner_allocator_type>
为 false,则xargs...
为args...
。如果
uses_allocator<Ty, inner_allocator_type>
为 true 且is_constructible<Ty, allocator_arg_t, inner_allocator_type, args...>
为 true,则xargs...
为allocator_arg, inner_allocator(), args...
。如果
uses_allocator<Ty, inner_allocator_type>
为 true 且is_constructible<Ty, args..., inner_allocator()>
为 true,则xargs...
为args..., inner_allocator()
。
第二种方法通过调用 Outermost_traits::construct(OUTERMOST(*this), &ptr->first, xargs...)
(其中 xargs...
是上述列表中经修改的 first...
)和 Outermost_traits::construct(OUTERMOST(*this), &ptr->second, xargs...)
(其中 xargs...
是上述列表中经修改的 second...
)在 ptr 处构造对对象。
第三种方法的行为与 this->construct(ptr, piecewise_construct, tuple<>, tuple<>)
相同。
第四种方法的行为与 this->construct(ptr, piecewise_construct, forward_as_tuple(std::forward<Uy1>(first), forward_as_tuple(std::forward<Uy2>(second))
相同。
第五种方法的行为与 this->construct(ptr, piecewise_construct, forward_as_tuple(right.first), forward_as_tuple(right.second))
相同。
第六种方法的行为与 this->construct(ptr, piecewise_construct, forward_as_tuple(std::forward<Uy1>(right.first), forward_as_tuple(std::forward<Uy2>(right.second))
相同。
scoped_allocator_adaptor::deallocate
通过使用外部分配器释放对象。
void deallocate(pointer ptr, size_type count);
参数
ptr
指向要释放对象的起始位置的指针。
count
要释放对象的数量。
scoped_allocator_adaptor::destroy
销毁指定的对象。
template <class Ty>
void destroy(Ty* ptr)
参数
ptr
指向要销毁对象的指针。
返回值
Outermost_traits::destroy(OUTERMOST(*this), ptr)
scoped_allocator_adaptor::inner_allocator
检索对类型为 inner_allocator_type
的存储对象的引用。
inner_allocator_type& inner_allocator() noexcept;
const inner_allocator_type& inner_allocator() const noexcept;
返回值
对类型为 inner_allocator_type
的存储对象的引用。
scoped_allocator_adaptor::max_size
确定可通过外部分配器分配的对象的最大数目。
size_type max_size();
返回值
Outer_traits::max_size(outer_allocator())
scoped_allocator_adaptor::operator=
scoped_allocator_adaptor& operator=(const scoped_allocator_adaptor&) = default;
scoped_allocator_adaptor& operator=(scoped_allocator_adaptor&&) = default;
scoped_allocator_adaptor::operator==
template <class OuterA1, class OuterA2, class... InnerAllocs>
bool operator==(const scoped_allocator_adaptor<OuterA1, InnerAllocs...>& a,
const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& b) noexcept;
scoped_allocator_adaptor::operator!=
template <class OuterA1, class OuterA2, class... InnerAllocs>
bool operator!=(const scoped_allocator_adaptor<OuterA1, InnerAllocs...>& a,
const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& b) noexcept;
scoped_allocator_adaptor::outer_allocator
检索对类型为 outer_allocator_type
的存储对象的引用。
outer_allocator_type& outer_allocator() noexcept;
const outer_allocator_type& outer_allocator() const noexcept;
返回值
对类型为 outer_allocator_type
的存储对象的引用。
scoped_allocator_adaptor::rebind 结构
将 Outer::rebind\<Other>::other
类型定义为 scoped_allocator_adaptor\<Other, Inner...>
的同义词。
struct rebind{ typedef Other_traits::rebind<Other> Other_alloc; typedef scoped_allocator_adaptor<Other_alloc, Inner...> other; };
scoped_allocator_adaptor::scoped_allocator_adaptor 构造函数
构造 scoped_allocator_adaptor
对象。 还包括一个析构函数。
scoped_allocator_adaptor();
scoped_allocator_adaptor(const scoped_allocator_adaptor& right) noexcept;
template <class Outer2>
scoped_allocator_adaptor(
const scoped_allocator_adaptor<Outer2, Inner...>& right) noexcept;
template <class Outer2>
scoped_allocator_adaptor(
scoped_allocator_adaptor<Outer2, Inner...>&& right) noexcept;
template <class Outer2>
scoped_allocator_adaptor(Outer2&& al,
const Inner&... rest) noexcept;
~scoped_allocator_adaptor();
参数
right
现有 scoped_allocator_adaptor
。
al
要用作外部分配器的现有分配器。
rest
要用作内部分配器的分配器列表。
备注
第一个构造函数默认构造其存储分配器对象。 后面三个构造函数中的每一个都会从 right 中的相应对象构造其存储分配器对象。 最后一个构造函数从参数列表中相应参数构造其存储分配器对象。
scoped_allocator_adaptor::select_on_container_copy_construction
创建一个新的 scoped_allocator_adaptor
对象,其中每个存储分配器对象都可通过调用每个相应分配器的 select_on_container_copy_construction
进行初始化。
scoped_allocator_adaptor select_on_container_copy_construction();
返回值
实际上,此方法将返回 scoped_allocator_adaptor(Outer_traits::select_on_container_copy_construction(*this), inner_allocator().select_on_container_copy_construction())
。 结果为新的 scoped_allocator_adaptor
对象,其中每个存储分配器对象都可通过调用相应分配器 al 的 al.select_on_container_copy_construction()
进行初始化。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈