76

私は2つのベクトルを持っています:

std::vector<int> v1, v2;

// Filling v1
...

にコピーv1する必要がありますv2。優先する理由はありますか

v2 = v1;

std::copy (v1.begin(), v1.end(), v2.begin());

(またはその逆)?

4

6 に答える 6

93

一般的に私は強く好むでしょうv2 = v1

  1. 短くなり、意図がより明確になります
  2. std::copyv2が同じ長さでない場合は機能しませんv1(サイズを変更しないため、古い要素の一部が最良の場合に保持されます (v2.size() > v1.size()最悪の場合、プログラムの他の場所で使用されるランダムなデータが上書きされます)
  3. 有効期限が近づいている (そして C++11 を使用している)場合は、内容v1を簡単に変更できます。move
  4. std::copy実装者はおそらくstd::copy内部的に使用するため、パフォーマンス上の利点が得られる場合は、パフォーマンスに関する割り当てが より遅くなる可能性は低いです。

結論として、std::copy表現力が低く、間違ったことをする可能性があり、さらに高速ではありません。したがって、ここでそれを使用する理由はまったくありません。

于 2013-02-20T10:37:18.157 に答える
14

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

于 2013-02-20T10:40:14.923 に答える
12

の呼び出しはstd::copy、宛先ベクトルの末尾を超えてアイテムにアクセスしようとする場合があります。

割り当てを使用します。

マイクロ最適化はあなたの仕事ではありません。それはライブラリ作成者の責任であり、最終的にはコンパイラの責任です。

正確である必要がなければ、コードを任意に高速化できます。

ただし、の場合copy、それがより速いかどうかはかなり疑わしく、一般的なケースでは正しくないことは確かです。

于 2013-02-20T10:35:56.493 に答える
2

短いです。

std::copy主にコンテナのセクションをコピーするためのものです。コンテナー全体をコピーする必要がある場合は、コピー コンストラクターを使用することもできます。

于 2013-02-20T10:35:22.363 に答える
2

割り当て、断然。より一般的には、ベクトルのサイズが変更されるか、ベクトルの内容全体が変更される可能性がある場合はいつでも、メンバー関数を優先する必要があります。適切な唯一の時間std::copyは、完全にベクトル内の小さな範囲のみを置換する場合です。

于 2013-02-20T10:36:44.447 に答える
1

割り当てはより明確であり、内部使用std::copy(またはunitizalized_copy _M_allocate_and_copyサイズと容量によって異なります) またはパフォーマンスは同じです。

于 2013-02-20T10:46:41.530 に答える