10

私は2つのコンテナを持っています、それらが次のように定義されているとしましょう:

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

a両方を想定し、データbが入力されています。move-semanticsを使用して、コンテナ全体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)になるため、1つずつ挿入するループを記述したくありません。他のオプションはありますか?

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な数の空白要素を(1回のショットで)使用してから、を使用します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 に答える