10

我有两个容器,假设它们的定义如下:

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

假设两者都ab填充。我想使用移动语义将整个容器插入a 到 中的特定位置,以便s 移动到. 让我们假设是一个有效的迭代器到. 以下不起作用:bunique_ptrbib

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

是否有另一种 STL 算法可以实现这种“移动插入范围”?我想我需要一种emplace_range,但 VS2010 的 STL 中没有。我不想编写一个一个一个插入的循环,因为每次插入时都会向上移动向量的全部内容,因此最终会导致令人讨厌的 O(n^2) 。还有其他选择吗?

4

3 回答 3

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); 
于 2010-11-15T17:20:54.017 回答
4

insert在目标中所需数量的空白元素(一次拍摄),然后使用swap_ranges. 无论如何,源元素将毫无用处,因为这是unique_ptr.

这适用于 C++0x之前的版本,但另一个答案显然更适合 Visual C++ 10。

于 2010-11-15T17:17:26.750 回答
1

其实你可以用好旧的std::swap_ranges(...)

http://www.cplusplus.com/reference/algorithm/swap_ranges/

于 2011-01-28T08:32:20.117 回答