私は2つのベクトルを持っています:
std::vector<int> v1, v2;
// Filling v1
...
にコピーv1
する必要がありますv2
。優先する理由はありますか
v2 = v1;
に
std::copy (v1.begin(), v1.end(), v2.begin());
(またはその逆)?
一般的に私は強く好むでしょうv2 = v1
:
std::copy
v2
が同じ長さでない場合は機能しませんv1
(サイズを変更しないため、古い要素の一部が最良の場合に保持されます (v2.size() > v1.size()
最悪の場合、プログラムの他の場所で使用されるランダムなデータが上書きされます)v1
を簡単に変更できます。move
std::copy
実装者はおそらくstd::copy
内部的に使用するため、パフォーマンス上の利点が得られる場合は、パフォーマンスに関する割り当てが より遅くなる可能性は低いです。結論として、std::copy
表現力が低く、間違ったことをする可能性があり、さらに高速ではありません。したがって、ここでそれを使用する理由はまったくありません。
v2
十分に大きくない場合は、そのまま使用するとバッファオーバーランが発生copy
します。
でpush_backを呼び出すバックインサートイテレータを使用できますv2
。ただし、サイズによっては、複数の再割り当てが発生する可能性v1
があります。
copy(v1.begin(), v1.end(), back_inserter(v2));
vector
物事を正しく管理させたほうがいいです。代入演算子は、次のようにこれを行いvector::assign
ます。
v2.assign(v1.begin(), v1.end());
代入演算子がで実装されていることに気づきましたvector::assign
。
の呼び出しはstd::copy
、宛先ベクトルの末尾を超えてアイテムにアクセスしようとする場合があります。
割り当てを使用します。
マイクロ最適化はあなたの仕事ではありません。それはライブラリ作成者の責任であり、最終的にはコンパイラの責任です。
正確である必要がなければ、コードを任意に高速化できます。
ただし、の場合copy
、それがより速いかどうかはかなり疑わしく、一般的なケースでは正しくないことは確かです。
短いです。
std::copy
主にコンテナのセクションをコピーするためのものです。コンテナー全体をコピーする必要がある場合は、コピー コンストラクターを使用することもできます。
割り当て、断然。より一般的には、ベクトルのサイズが変更されるか、ベクトルの内容全体が変更される可能性がある場合はいつでも、メンバー関数を優先する必要があります。適切な唯一の時間std::copy
は、完全にベクトル内の小さな範囲のみを置換する場合です。
割り当てはより明確であり、内部使用std::copy
(またはunitizalized_copy
_M_allocate_and_copy
サイズと容量によって異なります) またはパフォーマンスは同じです。