私は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);
}
どうやってやるの?
参照によって引数を送信する場合、2番目の例は機能しません。もしかして
void copyVecFast(vec<int> original) // no reference
{
vector<int> new_;
new_.swap(original);
}
それは機能しますが、より簡単な方法は
vector<int> new_(original);
しかし、それらは同じではありませんか? 1つはコピー、もう1つはスワップ。したがって、関数名。
私のお気に入りは:
a = b;
ここで、a
およびb
はベクトルです。
これはベクターのコピーを作成する別の有効な方法で、コンストラクターを使用するだけです:
std::vector<int> newvector(oldvector);
これは、std::copy
を使用してベクター全体を最初から最後まで歩いてstd::back_insert
を使用して新しいベクターに入れるよりも簡単です。
つまり、あなたの.swap()
oneはコピーではなく、2つのベクトルを交換します。オリジナルを変更して、何も含まれないようにします!これはコピーではありません。
スワップを使用してベクターをコピーしないでください。「元の」ベクターが変更されます。
代わりに、元のパラメーターを新しいパラメーターに渡します。
new_vector.assign(old_vector.begin(),old_vector.end()); // Method 1
new_vector = old_vector; // Method 2
=
演算子を使用しますコンテナーstd::vector::operator=
のパブリックメンバー関数std::vector
を使用して、ベクターから別のベクターに値を割り当てることができます。
また、コンストラクター関数も理にかなっています。別のベクトルをパラメーターとして持つコンストラクター関数(例:x
)は、x
の各要素のコピーを同じ順序でコンテナーを構築します。
std::vector::swap
を使用しないでくださいstd::vector::swap
はcopyingベクトルを別のベクトルにコピーするのではなく、実際には2つのベクトルの要素をスワップしますその名前が示唆する。言い換えると、コピー元のベクターはstd::vector::swap
が呼び出された後に変更されますが、これはおそらく予想したものとは異なります。
ソースベクトルの要素が他のデータへのポインターである場合、ディープコピーが必要になることがあります。
ウィキペディアによると:
ディープコピー。フィールドが逆参照されます。コピーされるオブジェクトへの参照ではなく、参照オブジェクトに対して新しいコピーオブジェクトが作成され、これらへの参照がBに配置されます。
実際、C++にはディープコピーを行う組み込みの方法は現在ありません。上記の方法はすべて浅いです。ディープコピーが必要な場合は、ベクトルを走査して、参照のコピーを手動で作成できます。あるいは、イテレータをトラバースすることを検討できます。イテレータに関する議論は、この問題を超えています。