您的問題與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項的分配不能改變,所以答案我uld在這裏結束,但在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_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
傳遞一個allocator,所以將建設這樣的:myvect(v, A1<int>(mapInstance.get_allocator()))
。
如果這一切都有點混亂,歡迎來到我的世界,但不用擔心,你的情況vector<int>
將總是使用std::allocator<int>
。
你應該知道的第一件事是,在標準庫,分配器改變容器(它的容器的模板參數)的類型,默認分配是無狀態的,因此*確切*分配器的副本在你的例子中使用它將不會有所作爲。 –
是什麼'd_dataBegin'?在問題的最後一個字之前,這似乎沒有提到任何地方! –