跳到主要内容

std::scoped_allocator_adaptor

定义于scoped_allocator
自 C++11 起
template< class OuterAlloc, class... InnerAllocs >
class scoped_allocator_adaptor : public OuterAlloc;

std::scoped_allocator_adaptor 类模板是一个分配器,可用于多级容器(向量、集合、列表、元组、映射等)。它通过一个外部分配器类型 OuterAlloc 和零个或多个内部分配器类型 InnerAlloc... 实例化。直接使用 scoped_allocator_adaptor 构造的容器使用 OuterAlloc 来分配其元素,但如果元素本身是容器,则它使用第一个内部分配器。该容器的元素,如果它们本身是容器,则使用第二个内部分配器,以此类推。如果容器的层级多于内部分配器,则最后一个内部分配器将重用于所有进一步嵌套的容器。

此适配器的目的是正确初始化嵌套容器中的有状态分配器,例如当嵌套容器的所有层级都必须放置在同一个共享内存段中时。适配器的构造函数接受列表中所有分配器的参数,并且每个嵌套容器根据需要从适配器获取其分配器的状态。

此适配器的目的是正确初始化嵌套容器中的有状态分配器,例如当嵌套容器的所有层级都必须放置在同一个共享内存段中时。适配器的构造函数接受列表中所有分配器的参数,并且每个嵌套容器根据需要从适配器获取其分配器的状态。

对于 scoped_allocator_adaptor,如果下一个内部分配器是 A,则任何满足 std::uses_allocator<T,A>::value == true 的类 T 都像容器一样参与递归。此外,std::pair 通过 scoped_allocator_adaptor::construct 的特定重载被视为此类容器。

典型实现将 std::scoped_allocator_adaptor<InnerAllocs...> 的实例作为成员对象。

成员类型

公开类型定义
公开outer_allocator_typeOuterAlloc
公开inner_allocator_typescoped_allocator_adaptor<InnerAllocs...> 或,如果 sizeof...(InnerAllocs) == 0,则为 scoped_allocator_adaptor<OuterAlloc>
公开value_type
std::allocator_traits<OuterAlloc>::value_type
公开size_type
std::allocator_traits<OuterAlloc>::size_type
公开pointer
std::allocator_traits<OuterAlloc>::pointer
公开const_pointer
std::allocator_traits<OuterAlloc>::const_pointer
公开const_void_pointer
std::allocator_traits<OuterAlloc>::const_void_pointer
公开propagate_on_container_copy_assignment如果 OuterAlloc 和 InnerAlloc... 中至少有一个分配器 A 的 std::allocator_traits<A>::propagate_on_container_copy_assignment::value 为真,则为 std::true_type
公开propagate_on_container_move_assignment如果 OuterAlloc 和 InnerAlloc... 中至少有一个分配器 A 的 std::allocator_traits<A>::propagate_on_container_move_assignment::value 为真,则为 std::true_type
公开propagate_on_container_swap如果 OuterAlloc 和 InnerAlloc... 中至少有一个分配器 A 的 std::allocator_traits<A>::propagate_on_container_swap::value 为真,则为 std::true_type
公开is_always_equal如果 OuterAlloc 和 InnerAlloc... 中至少有一个分配器 A 的 std::allocator_traits<A>::propagate_on_container_swap::value 为真,则为 std::true_type
公开rebind
template< class T >
struct rebind {
typedef scoped_allocator_adaptor<
std::allocator_traits<OuterAlloc>::template rebind_alloc<T>,
InnerAllocs...
> other;
};

成员函数

公开(构造函数)创建新的 scoped_allocator_adaptor 实例
公开(析构函数)销毁 scoped_allocator_adaptor 实例
公开operator=赋值 scoped_allocator_adaptor
公开inner_allocator获取内部分配器引用
公开outer_allocator获取外部分配器引用
公开allocate使用外部分配器分配未初始化存储
公开deallocate使用外部分配器释放存储
公开max_size返回外部分配器支持的最大分配大小
公开构造在已分配存储中构造对象,并在适当情况下将内部分配器传递给其构造函数
公开销毁销毁已分配存储中的对象
公开select_on_container_copy_construction复制 scoped_allocator_adaptor 及其所有分配器的状态

非成员函数

公开operator==
operator!= (在 C++20 中移除)
比较两个 scoped_allocator_adaptor 实例
推导指南 (自 C++17 起)

定义于头文件 <scoped_allocator>

自 C++17 起
template<class OuterAlloc, class... InnerAllocs>
scoped_allocator_adaptor(OuterAlloc, InnerAllocs...)
-> scoped_allocator_adaptor<OuterAlloc, InnerAllocs...>;

为 std::scoped_allocator_adaptor 提供了一个推导指南,以便推导出其外部分配器。

示例

#include <vector>
#include <scoped_allocator>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/allocators/adaptive_pool.hpp>
namespace bi = boost::interprocess;
template<class T> using alloc = bi::adaptive_pool<T,
bi::managed_shared_memory::segment_manager>;
using ipc_row = std::vector<int, alloc<int>>;
using ipc_matrix = std::vector<ipc_row, std::scoped_allocator_adaptor<alloc<ipc_row>>>;
int main ()
{
bi::managed_shared_memory s(bi::create_only, "Demo", 65536);

// create vector of vectors in shared memory
ipc_matrix v(s.get_segment_manager());

// for all these additions, the inner vectors obtain their allocator arguments
// from the outer vector's scoped_allocator_adaptor
v.resize(1); v[0].push_back(1);
v.emplace_back(2);
std::vector<int> local_row = {1,2,3};
v.emplace_back(local_row.begin(), local_row.end());

bi::shared_memory_object::remove("Demo");
}

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 2108C++11无法显示 scoped_allocator_adaptor 是否无状态提供了 is_always_equal

std::scoped_allocator_adaptor

定义于scoped_allocator
自 C++11 起
template< class OuterAlloc, class... InnerAllocs >
class scoped_allocator_adaptor : public OuterAlloc;

std::scoped_allocator_adaptor 类模板是一个分配器,可用于多级容器(向量、集合、列表、元组、映射等)。它通过一个外部分配器类型 OuterAlloc 和零个或多个内部分配器类型 InnerAlloc... 实例化。直接使用 scoped_allocator_adaptor 构造的容器使用 OuterAlloc 来分配其元素,但如果元素本身是容器,则它使用第一个内部分配器。该容器的元素,如果它们本身是容器,则使用第二个内部分配器,以此类推。如果容器的层级多于内部分配器,则最后一个内部分配器将重用于所有进一步嵌套的容器。

此适配器的目的是正确初始化嵌套容器中的有状态分配器,例如当嵌套容器的所有层级都必须放置在同一个共享内存段中时。适配器的构造函数接受列表中所有分配器的参数,并且每个嵌套容器根据需要从适配器获取其分配器的状态。

此适配器的目的是正确初始化嵌套容器中的有状态分配器,例如当嵌套容器的所有层级都必须放置在同一个共享内存段中时。适配器的构造函数接受列表中所有分配器的参数,并且每个嵌套容器根据需要从适配器获取其分配器的状态。

对于 scoped_allocator_adaptor,如果下一个内部分配器是 A,则任何满足 std::uses_allocator<T,A>::value == true 的类 T 都像容器一样参与递归。此外,std::pair 通过 scoped_allocator_adaptor::construct 的特定重载被视为此类容器。

典型实现将 std::scoped_allocator_adaptor<InnerAllocs...> 的实例作为成员对象。

成员类型

公开类型定义
公开outer_allocator_typeOuterAlloc
公开inner_allocator_typescoped_allocator_adaptor<InnerAllocs...> 或,如果 sizeof...(InnerAllocs) == 0,则为 scoped_allocator_adaptor<OuterAlloc>
公开value_type
std::allocator_traits<OuterAlloc>::value_type
公开size_type
std::allocator_traits<OuterAlloc>::size_type
公开pointer
std::allocator_traits<OuterAlloc>::pointer
公开const_pointer
std::allocator_traits<OuterAlloc>::const_pointer
公开const_void_pointer
std::allocator_traits<OuterAlloc>::const_void_pointer
公开propagate_on_container_copy_assignment如果 OuterAlloc 和 InnerAlloc... 中至少有一个分配器 A 的 std::allocator_traits<A>::propagate_on_container_copy_assignment::value 为真,则为 std::true_type
公开propagate_on_container_move_assignment如果 OuterAlloc 和 InnerAlloc... 中至少有一个分配器 A 的 std::allocator_traits<A>::propagate_on_container_move_assignment::value 为真,则为 std::true_type
公开propagate_on_container_swap如果 OuterAlloc 和 InnerAlloc... 中至少有一个分配器 A 的 std::allocator_traits<A>::propagate_on_container_swap::value 为真,则为 std::true_type
公开is_always_equal如果 OuterAlloc 和 InnerAlloc... 中至少有一个分配器 A 的 std::allocator_traits<A>::propagate_on_container_swap::value 为真,则为 std::true_type
公开rebind
template< class T >
struct rebind {
typedef scoped_allocator_adaptor<
std::allocator_traits<OuterAlloc>::template rebind_alloc<T>,
InnerAllocs...
> other;
};

成员函数

公开(构造函数)创建新的 scoped_allocator_adaptor 实例
公开(析构函数)销毁 scoped_allocator_adaptor 实例
公开operator=赋值 scoped_allocator_adaptor
公开inner_allocator获取内部分配器引用
公开outer_allocator获取外部分配器引用
公开allocate使用外部分配器分配未初始化存储
公开deallocate使用外部分配器释放存储
公开max_size返回外部分配器支持的最大分配大小
公开构造在已分配存储中构造对象,并在适当情况下将内部分配器传递给其构造函数
公开销毁销毁已分配存储中的对象
公开select_on_container_copy_construction复制 scoped_allocator_adaptor 及其所有分配器的状态

非成员函数

公开operator==
operator!= (在 C++20 中移除)
比较两个 scoped_allocator_adaptor 实例
推导指南 (自 C++17 起)

定义于头文件 <scoped_allocator>

自 C++17 起
template<class OuterAlloc, class... InnerAllocs>
scoped_allocator_adaptor(OuterAlloc, InnerAllocs...)
-> scoped_allocator_adaptor<OuterAlloc, InnerAllocs...>;

为 std::scoped_allocator_adaptor 提供了一个推导指南,以便推导出其外部分配器。

示例

#include <vector>
#include <scoped_allocator>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/allocators/adaptive_pool.hpp>
namespace bi = boost::interprocess;
template<class T> using alloc = bi::adaptive_pool<T,
bi::managed_shared_memory::segment_manager>;
using ipc_row = std::vector<int, alloc<int>>;
using ipc_matrix = std::vector<ipc_row, std::scoped_allocator_adaptor<alloc<ipc_row>>>;
int main ()
{
bi::managed_shared_memory s(bi::create_only, "Demo", 65536);

// create vector of vectors in shared memory
ipc_matrix v(s.get_segment_manager());

// for all these additions, the inner vectors obtain their allocator arguments
// from the outer vector's scoped_allocator_adaptor
v.resize(1); v[0].push_back(1);
v.emplace_back(2);
std::vector<int> local_row = {1,2,3};
v.emplace_back(local_row.begin(), local_row.end());

bi::shared_memory_object::remove("Demo");
}

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 2108C++11无法显示 scoped_allocator_adaptor 是否无状态提供了 is_always_equal