ベクターコンテンツの所有権をあるベクターから別のベクターに譲渡することは可能ですか?
vector<T> v1;
// fill v1
vector<T> v2 = OvertakeContents(v1);
// now v1 would be empty and v2 would have all the contents of v1
スプライス機能付きのリストが可能です。これは、ベクトル全体でも一定時間で可能になるはずです。
そうでない場合は、なぜですか?
std::swapをチェックしてください
vector<T> v1;
// fill v1
vector<T> v2;
swap(v1, v2);
OR
v2.swap(v1);
std :: vectorには、このように機能するswap()関数があります。
vector<T> v2;
v2.swap(v1);
ここに2つのポイントがあります:
1)割り当て可能なタイプの場合、スワップは割り当ての観点から定義できます。これには3つの割り当てが必要であり、それぞれがコンテナタイプの場合、コンテナのサイズに比例します。したがって、ある意味で、a.swap(b)は冗長です。これは、効率を上げるためだけに存在します。ベクトルやリストなどの多くのコンテナーでは、実行時の複雑さが線形ではなく一定になるようにスワップを実装できます。一部のコンテナタイプXでこれが可能な場合、テンプレートの特殊化swap(X&、X&)は、X :: swap(X&)で簡単に記述できます。これは、X :: swap(X&)は、そのような定数時間の実装が存在する場合にのみ定義する必要があることを意味します。すべてのコンテナクラスXにそのようなメンバー関数が必要なわけではありませんが、メンバー関数が存在する場合は、一定時間で償却されることが保証されます。
2)所有権を譲渡したいのと同じ要素を持つ別のコンテナが必要な場合効率を上げるために簡単なコピーを作成してください