c – 分配嵌套STL容器时使用哪个分配器?

c – 分配嵌套STL容器时使用哪个分配器?,第1张

概述我有一个关于STL类和分配器的问题,这些问题似乎不容易在网上找到.有谁知道在嵌套的STL类中使用了哪个分配器?例如: typedef std::vector<int> myvect; //按照后续回复/评论的指示编辑了以下行 typedef std::map<int, myvect, std::less<int>, A> mymap; //uses my custom allocator for 我有一个关于STL类和分配器的问题,这些问题似乎不容易在网上找到.有谁知道在嵌套的STL类中使用了哪个分配器?例如:

typedef std::vector<int> myvect;

//按照后续回复/评论的指示编辑了以下行

typedef std::map<int,myvect,std::less<int>,A> mymap; //uses my custom allocator for map creation

让我们调用默认的分配器D,并假设我有一个自定义分配器A.

如果我做了以下事情将会发生什么:

>创建地图:

mymap mAPInstance;

>现在,假设mAPInstance [0]存在一个条目,假设我将一个值推入向量:

mAPInstance[0].push_back(999);

什么分配器用于向量mAPInstance [0]的动态内存?

到目前为止,我的理解是使用了默认的分配器D,但是我想确认不会使用传递给映射的自定义分配器A. (据我所知,只有我使用某种嵌套分配选项才会发生这种情况.)

当然,我理解mAPInstance [0]的元数据/头信息是使用自定义分配器A分配的.我关心的是动态内存部分,即d_dataBegin之后的部分.

解决方法 您的问题与 Scoped Allocator Model有关,这是一种分配器设计风格,它自动将容器的分配器传播到容器的元素,这样您就可以确保所有容器的元素都是从同一个分配器中分配的.更多关于以下内容.

回答你的问题:

1)容器默认情况下不使用作用域分配器模型,您必须显式请求它(请参阅下面的scoped_allocator_adaptor)

2)您的嵌套容器是类型std :: vector< int>这意味着它使用默认的std :: allocator< int>分配器,以及该类型的所有实例都是相同的,所以你的问题的答案是它使用标准的分配器 – 哪个是无关紧要的,因为每个std :: allocator< int>是一样的.

这个答案的其余部分只是一个思想实验,你问题的答案如上:vector< int>总是使用std :: allocator< int>

现在,如果您的嵌套类型是std :: vector< int,A1< int>>其中A1< int>是一个自定义分配器,问题变得更有趣.

嵌套容器将使用它构造的分配器,并且您没有显示,因为您已经说过“假设mAPInstance [0]存在一个条目”,并且该条目的创建方式决定了它将使用哪个分配器.

如果该条目是这样创建的:

mAPInstance[0];

然后该条目是默认构造的,并将使用默认构造的A1< int>.

如果该条目是这样创建的:

A1<int> a1( /* args */ );myvect v(a1)mAPInstance.insert(mymap::value_type(0,v));

然后该条目将是v的副本,并且在C 03中它的分配器将是v.get_allocator()的副本,但是在C 11中它的分配器将是std :: allocator_traits< A1< int>> ::的副本:: select_on_container_copy_construction(v.get_allocator()),它可能是v.get_allocator()的副本,但可能是不同的东西(例如,默认构造的A1).

(在C 03中,条目的分配器在创建之后无法更改,因此答案将在此处结束,但在C 11中它可以被替换.我假设我们正在讨论C 11以解决此问题的其余部分,因为分配器不是很有趣的是C 03.)

如果该条目被修改如下:

A1<int> a1( /* args */ );myvect v(a1)mAPInstance[0] = v;

然后,矢量被复制分配给,可能会替换分配器,具体取决于std :: allocator_traits< A1< int>> :: propagate_on_container_copy_assignment :: value的值

如果该条目被修改如下:

A1<int> a1( /* args */ );mAPInstance[0] = myvect(a1);

然后向量移动分配给,具体取决于std :: allocator_traits< A1< int>> :: propagate_on_container_move_assignment :: value的值

如果该条目被修改如下:

A1<int> a1( /* args */ );myvect v(a1)swap( mAPInstance[0],v );

然后,矢量交换,具体取决于std :: allocator_traits< A1< int>> :: propagate_on_container_swap :: value的值

现在,如果A是std :: scoped_allocator_adaptor< A1< std :: pair< const int,myvect>>>事情变得更有趣! scoped_allocator_adaptor,顾名思义,是一个适配器,它允许任何分配器类型与Scoped Allocator Model一起使用,这意味着容器的分配器可以传递给容器的子节点,子节点传递给子节点的子节点等等.因为这些类型使用分配器并且可以用它们构造.)

默认情况下,容器和分配器不使用作用域分配器模型,您需要使用scoped_allocator_adaptor(或编写自己的分配器类型,使用它). (而C 03对于作用域分配器完全没有支持.)

如果该条目是这样创建的:

mAPInstance[0];

然后,scoped_allocator_adaptor将使用map的allocator的副本构造它,而不是默认构造的条目,因此该条目将构造为myvect(A1< int>(mAPInstance.get_allocator())).

如果该条目是这样创建的:

A1<int> a1( /* args */ );myvect v(a1)mAPInstance.insert(mymap::value_type(0,v));

然后该条目将具有v的数据的副本,但不会使用其分配器,而是由scoped_allocator_adaptor传递分配器,因此将构造为:myvect(v,A1< int>(mAPInstance.get_allocator()) ).

如果这有点令人困惑,欢迎来到我的世界,但不要担心,在你的情况下矢量< int>将始终使用std :: allocator< int>.

总结

以上是内存溢出为你收集整理的c – 分配嵌套STL容器时使用哪个分配器?全部内容,希望文章能够帮你解决c – 分配嵌套STL容器时使用哪个分配器?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1219769.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存