2016-12-30 3 views
-1

にセッターには?私はmyVectorを格納するためにスマートポインタを使用したくありません。移動セマンティクスを使用できますか?これを行う方法?効率的な通過ベクトルは、私はクラスを持っているクラス

+2

のstd ::動きが心に来る。 – DeiDei

+0

'example.getMyVector()'をしておかないと、 'methodCreatingNewMyVector'の中のターゲットベクトルで直接作業するのはなぜですか? – Unimportant

+0

申し訳ありません。私はconst goを追加するのを忘れましたgetMyVector() – Marcin

答えて

4

ちょうどstd::vector<int>への右辺値参照を取るsetMyVector()過負荷を提供し、そこにオブジェクトを移動、例えば:明らか

void setMyVector(std::vector<int>&& newVector) { 
    this->myVector = std::move(newVector); 
} 

、あなたが適切にこの関数を呼びたい:

example.setMyVector(std::move(newMyVector)); 
+0

こんにちは、あなたはなぜ参照するためにパラメータ参照をする必要があるのですか? –

+2

@LorenceHernandez: '&&'は「参照への参照」ではなく、* r値の参照*です。コメントはおそらくC++の移動セマンティクスを導入するのがやや簡潔ですが、基本的な考え方は、左辺値(何らかの意味で参照できるもの)を右辺値参照にバインドできないということです。右辺値参照に一時的な(例えば、 'std :: move()'を使って)見えるようにした一時的なものや左辺値をバインドすることはできます。結論は:rvalue参照は、それが参照しているオブジェクトが近づいておらず、表現を転送できることを示しています。この 'setMyVector()'のオーバーロードは表現を転送します。 –

1

はい、明示的にstd::move()を呼び出すことによってベクトルをコピーせずに移動することができます。これはstd::vectorコンストラクタは、このタイプの利点を活用するための特別なコンストラクタを持っている、右辺値参照に、あなたのベクトルをキャスト:

example.setMyVector(std::move(newMyVector)); 

setMyVector()で右辺値参照を求めるようにしてください:

void setMyVector (std::vector<int> && vec) 
            ^^rvalue reference 
+0

setMyVectorが引数をstd :: moveがあまり機能しないR値refとして受け取らない場合、 – RyanP

+0

@ RyanP mhmは編集中です。 –

+0

@RyanP:実際には、 'setMyVector()'は、コピーエリートによるコピーや移動を避けることができるので、値で引数を取ることもできます。しかし、上記のクラスのようなものでは、私はむしろ既存のメモリを再利用する可能性がある特別な左辺値の割り当てを持っています。 –

関連する問題