web-dev-qa-db-ja.com

あるベクトルを別のベクトルにコピーする高速な方法

私は2つの方法が好きです:

void copyVecFast(const vec<int>& original)
{
  vector<int> newVec;
  newVec.reserve(original.size());
  copy(original.begin(),original.end(),back_inserter(newVec));
}

void copyVecFast(vec<int>& original)
{

  vector<int> newVec;
  newVec.swap(original); 
}

どうやってやるの?

131
Sasha

参照によって引数を送信する場合、2番目の例は機能しません。もしかして

void copyVecFast(vec<int> original) // no reference
{

  vector<int> new_;
  new_.swap(original); 
}

それは機能しますが、より簡単な方法は

vector<int> new_(original);
109
rlbond

しかし、それらは同じではありませんか? 1つはコピー、もう1つはスワップ。したがって、関数名。

私のお気に入りは:

a = b;

ここで、aおよびbはベクトルです。

217

これはベクターのコピーを作成する別の有効な方法で、コンストラクターを使用するだけです:

std::vector<int> newvector(oldvector);

これは、std::copyを使用してベクター全体を最初から最後まで歩いてstd::back_insertを使用して新しいベクターに入れるよりも簡単です。

つまり、あなたの.swap() oneはコピーではなく、2つのベクトルを交換します。オリジナルを変更して、何も含まれないようにします!これはコピーではありません。

64
X-Istence

スワップを使用してベクターをコピーしないでください。「元の」ベクターが変更されます。

代わりに、元のパラメーターを新しいパラメーターに渡します。

13
Raz
new_vector.assign(old_vector.begin(),old_vector.end()); // Method 1
new_vector = old_vector; // Method 2
11
Fake_Death

直接の答え:

  • =演算子を使用します

コンテナーstd::vector::operator=のパブリックメンバー関数std::vectorを使用して、ベクターから別のベクターに値を割り当てることができます。

  • コンストラクター関数を使用する

また、コンストラクター関数も理にかなっています。別のベクトルをパラメーターとして持つコンストラクター関数(例:x)は、xの各要素のコピーを同じ順序でコンテナーを構築します。

あぶない:

  • std::vector::swapを使用しないでください

std::vector::swapcopyingベクトルを別のベクトルにコピーするのではなく、実際には2つのベクトルの要素をスワップしますその名前が示唆する。言い換えると、コピー元のベクターはstd::vector::swapが呼び出された後に変更されますが、これはおそらく予想したものとは異なります。

  • 深いコピーか浅いコピーか?

ソースベクトルの要素が他のデータへのポインターである場合、ディープコピーが必要になることがあります。

ウィキペディアによると:

ディープコピー。フィールドが逆参照されます。コピーされるオブジェクトへの参照ではなく、参照オブジェクトに対して新しいコピーオブジェクトが作成され、これらへの参照がBに配置されます。

実際、C++にはディープコピーを行う組み込みの方法は現在ありません。上記の方法はすべて浅いです。ディープコピーが必要な場合は、ベクトルを走査して、参照のコピーを手動で作成できます。あるいは、イテレータをトラバースすることを検討できます。イテレータに関する議論は、この問題を超えています。

参照資料

cplusplus.comのstd::vectorのページ

10
Jerry Yang