2010-11-15 30 views
10

我有兩個容器,讓我們說,他們這樣定義:如何在C++ 0x STL中處理缺失的'emplace_range'?

std::vector<std::unique_ptr<int>> a; 
std::vector<std::unique_ptr<int>> b; 

假設都ab被填充。我想使用移動語義將整個容器a插入到b中的特定位置,以便unique_ptr移動到b。我們假設i是一個有效的迭代器,在b的某處。以下不起作用:

b.insert(i, a.begin(), a.end()); // error: tries to copy, not move, unique_ptrs 

是否有另一種STL算法,可以實現這種'插入範圍移動'?我想我需要一種emplace_range,但VS2010的STL中沒有一個。我不想編寫一個一個一個地插入的循環,因爲每次插入時都會移動向量的全部內容,因此會導致令人討厭的O(n^2)。任何其他選項?

回答

17
auto a_begin = std::make_move_iterator(a.begin()); 
auto a_end = std::make_move_iterator(a.end()); 

b.insert(i, a_begin, a_end); 
+2

令人敬畏。不知道'make_move_iterator'。 – AshleysBrain 2010-11-15 17:25:01

+1

VS2010確實支持這一點。好。 – 2010-11-15 17:25:02

4

insert所需的目標空白元素數量(一次性),然後使用swap_ranges。源元素將無用,因爲這是unique_ptr

將預的C++ 0x,但對方的回答工作是爲Visual C顯然更好++ 10

+0

它會,如果有'unique_ptr'預C++ 0x;)但它是一個巧妙的技巧無論如何。 – AshleysBrain 2010-11-15 18:21:38