您的问题与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 将使用映射分配器的副本而不是默认构造的条目来构造它,因此条目将像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()) )。
如果这有点令人困惑,欢迎来到我的世界,但别担心,在你的情况下,vector<int> 将始终使用std::allocator<int>。