2009-09-23 8 views
5

ベクターコンテンツの所有権をあるベクターから別のベクターに譲渡することは可能ですか?STLコンテナ内の所有権を移転しますか?

vector<T> v1; 
// fill v1 
vector<T> v2 = OvertakeContents(v1); 
// now v1 would be empty and v2 would have all the contents of v1 

スプライス機能を持つリストでは可能です。 これは、ベクトル全体に対しても一定の時間内に可能でなければなりません。

なぜそうでないのですか?

+2

サイドノートのための単純なコピーを作成してください:「スワップ」は既に述べました。しかし、私はそれをC++ 0xに追加したいと思います。単に "OvertakeContents"を "std :: move"に置き換えるだけで、あなたが望むことができます。 – sellibitze

答えて

10

チェックアウトのstd ::スワップ

vector<T> v1; 
// fill v1 

vector<T> v2; 

swap(v1, v2); 
OR 
v2.swap(v1); 

Swap Reference

+1

注釈は完全に偽です:すべてのSTLコンテナは、a.swap(b) –

+0

@ Gregと同じセマンティクスで、std :: swap(a、b)の等価なオーバーロードを提供します。私のメモに誤りを指摘してくれてありがとう。 Vector.swapのリファレンスを見ると、実際には同じセマンティクスを持っています。 –

10

のstd ::ベクトルは次のようにかなり多くの作品のスワップ()関数があります。

vector<T> v2; 
v2.swap(v1); 
+0

私はほとんどあなたを賞賛しましたが、あなたのコードは構文的に間違っています。 – avakar

+0

@avakar:そうです。修正されました。 –

0

ここでは、2つの点がある:

1)任意アサイナブルタイプの場合は、スワップ割り当ての観点から定義することができます。これには3つの割り当てが必要です。各割り当ては、コンテナタイプではコンテナのサイズが線形です。ある意味では、a.swap(b)は冗長です。これは単に効率のために存在します。ベクトルやリストなどの多くのコンテナでは、実行時の複雑さが線形ではなく一定であるようにスワップを実装することが可能です。これがいくつかのコンテナタイプXで可能である場合、テンプレート特殊化スワップ(X &、X &)はX :: swap(X &)の形で単純に記述できます。この意味は、X :: swap(X &)は、そのような一定時間の実装が存在する場合にのみ定義されるべきであるということです。すべてのコンテナクラスXがそのようなメンバ関数を持つ必要はありませんが、メンバ関数がまったく存在する場合は、一定時間の償却が保証されます。

2)あなたが 所有権を譲渡したい対象の同じ要素を持つ別の容器が必要な場合は、より良い効率

関連する問題