C++ C++;14支持分配器的自定义容器

C++ C++;14支持分配器的自定义容器,c++,C++,我实现了我的自定义分配器,并可以将其与STL容器一起使用: std::map<int, int, std::less<int>, CustomAllocator<int,100>> m1; 其中分配器类型的定义如下: using allocator_type = pmr::polymorphic_allocator<byte>; 我们的客户端代码如下所示: test_resource tr; // our custom allocator sl

我实现了我的自定义分配器,并可以将其与STL容器一起使用:

std::map<int, int, std::less<int>, CustomAllocator<int,100>> m1;
其中分配器类型的定义如下:

using allocator_type = pmr::polymorphic_allocator<byte>;
我们的客户端代码如下所示:

test_resource tr; // our custom allocator
slist<pmr::string> lst(&tr);
测试资源tr;//我们的自定义分配器
滑动层lst和tr;

但是如何在C++11/14中实现同样的功能呢?要使用我的
CustomAllocator
,我应该在自定义容器中指定什么?

最简单的解决方案可能是遵循标准库的模型,并为您的容器提供它要使用的分配器的模板参数

当您这样做时,不要忘记标准库(从C++11开始)要求对分配器的所有访问都要经过
std::allocator_traits
,而不是直接访问分配器对象的成员(因为它可能没有所有成员)。您也应该这样做,以便与设计用于标准库的其他分配器兼容

作为使用分配器特征的一个例子,考虑这个设计的“容器”:

原因是分配器不需要提供
构造
成员。如果他们没有提供,则使用placement
new
。因此,实现构造函数的正确方法是:

StringContainer(std::string value, A a) : allocator(a)
{
  data = std::allocator_traits<A>::allocate(allocator, 1);
  std::allocator_traits<A>::construct(allocator, data, value);
}
实际上,甚至类的实现也有点错误<代码>数据的类型应为:

typename std::allocator_traits<A>::pointer data;
typename std::allocator\u traits::指针数据;

std容器将分配器作为模板参数。你也考虑过这样做吗?@Angew。谢谢我没有想到那个简单的想法。我试试看。我只是想,在自定义容器中使用自定义分配器时,有一些规则需要遵循。请您详细介绍一下
allocator\u traits
,并给出一些使用它的小例子好吗?魔鬼在细节:)有大量的文档说明了什么是分配器特征以及它们的用途。但我找不到任何小例子,说明如何使用它。我真的是个新手,不知道如何把它放在一个真实的例子中。这真是太棒了!事实上,这是整个网络中唯一的一个例子!)
template <class A>
struct StringContainer
{
  std::string *data;
  A allocator;

 StringContainer(std::string value, A allocator);
  ~StringContainer();
};
StringContainer(std::string value, A a) : allocator(a)
{
  data = allocator.allocate(sizeof(int));
  allocator.construct(data, value);
}
StringContainer(std::string value, A a) : allocator(a)
{
  data = std::allocator_traits<A>::allocate(allocator, 1);
  std::allocator_traits<A>::construct(allocator, data, value);
}
~StringContainer()
{
  std::allocator_traits<A>::destroy(allocator, data);
  std::allocator_traits<A>::deallocate(allocator, data, 1);
}
typename std::allocator_traits<A>::pointer data;