72

いくつかの要素を最初のベクトルから 2 番目のベクトルに移動するにはどうすればよいですか?要素は最初のベクトルから削除されますか?
を使用してstd::moveいる場合、要素は最初のベクトルから削除されません。
これは私が書いたコードです:

   move(xSpaces1.begin() + 7, xSpaces1.end(), back_inserter(xSpaces2));
4

4 に答える 4

69

std::moveコンテナではなく、要素std::copy操作します。コンテナを個別に変更する必要があります。たとえば、の最初の17要素を新しいベクトルに移動するには:v1v2

std::vector<Foo> v1, v2;

// populate v1 with at least 17 elements...

auto it = std::next(v1.begin(), 17);

std::move(v1.begin(), it, std::back_inserter(v2));  // ##

v1.erase(v1.begin(), it);

行の後##、の最初の17個の要素v1はまだそこにありますが、それらは「移動元」になっているため、不確定な状態になっています。

于 2013-02-21T14:24:13.743 に答える
39

を使用std::moveすると、オブジェクトをコピーするのではなく移動できるため、実行速度が向上する可能性があります。値の範囲を移動すると、節約がさらに大きくなる可能性があります。ただし、コンテナから範囲を移動すると、コンテナはこれらの値によって占められていた場所を保持したままになります。

これらのプレースホルダーを削除したい場合は、コンテナーのサイズを手動で変更して削除する必要があります (これらのコンテナー スポットを他の要素に再利用する場合は、その必要はありません)。vector::eraseこれを行う 1 つの方法は、コンテナーから移動したのと同じ範囲を呼び出すことです。

于 2013-02-21T14:23:37.807 に答える
6

あなたが考えているように、あるベクトルから別のベクトルに要素を移動することはできません。最初のベクトルから要素の位置を常に消去する必要があります。

すべての要素を最初のベクトルから 2 番目のベクトルに、またはその逆に変更する場合は、 swapを使用できます。

2 つのベクトル間で同じ量の要素を移動する場合は、 swap_rangesを使用できます。

于 2013-02-21T14:19:55.693 に答える