2012-02-11 11 views
4

std::vectorを関数パラメータとして入れ替えて、ベクトルをコピーする必要はありません。関数パラメータとしてstd :: vectorを入れ替えよう

function(std::vector<MyType>().swap(my_vector)); 

またはこのような私の場合:無効

std::make_pair(0, std::vector<MyType>().swap(my_vector)); 

しかし、もちろんのstd::vector::swap戻り、ない作成ベクトル、このような

何か。

これを行う方法はありますか?

+2

なぜリファレンスを使用しないのですか? – perreal

+0

@perreal私はこの機能を制御できないためです。 ( 'std :: make_pair') –

+0

@Jay:関数がその引数をコピーし、その関数を変更できない場合、関数が引数をコピーしないようにすることはできません。 (もちろん、 'std :: make_pair'の場合は、rvalue参照でパラメータを受け取り、' pair'コンストラクタに転送するバージョンがあり、それをコピーするのではなく引数を移動します(引数が値の参照)) – Mankarse

答えて

3

あなたのベクトルを取り、右辺値としてそれを返し、その後、あなたはstd::moveを使用することができ、任意の近代的なコンパイラを使用します。

function(std::move(my_vector)); 

それはあなたに利用できない場合、あなたはこのような何かを試みることができる:

template<typename T> 
T Move(T & val) 
{ 
    T ret; 
    ret.swap(val); 
    return ret; 
} 

あなたはそれに幸運があれば教えてください。

それとも、あなたはその作成後にペアに直接ベクトルを入れ替えることができます。

std::pair<int, std::vector<MyType> > p; 
p.second.swap(my_vector); 

けれども、私はあなたが右辺値としてstd::make_pairの戻り値を必要とする場合、これはあなたを助けにはなりませんね。

+0

自分の環境でC++ 11xをセットアップするのに問題があったので、 'std :: move'をテストすることができませんでしたが、うまくいくと確信しています。ありがとう。 –

関連する問題