2016-05-08 7 views
0

、これは(プライベートメンバーであるなど、これは_M_startとして動作しません)私は何をしたいです:ベクトルの一方向スワップは可能ですか? C++ 98では

void vectormove(std::vector<int>& a, std::vector<int>& b) 
{ 
    a._M_impl._M_start = b._M_impl._M_start; 
    a._M_impl._M_finish = b._M_impl._M_finish; 
    a._M_impl._M_end_of_storage = b._M_impl._M_end_of_storage; 
} 

これは私が

//vectors are predefined already 
std::vector<int> a; 
std::vector<int> b(10000000,20); 

//in later part of code 
//a=b; //expensive copy 
//std::swap(a,b); //inexpensive swap 
vectormove(a,b); //i need an inexpensive one way swap instead 

を呼び出したい方法です私はコピー、移動、スワップをゆるやかに使用して虐殺された用語を持っているかもしれませんが、私はこの主題をよりよく把握していません。私は私の意図を伝えることができたと思う。

+2

同じデータを参照する2つのベクトルが必要なのはなぜですか。それをどのように管理しますか? – juanchopanza

+4

['std :: move'](http://en.cppreference.com/w/cpp/utility/move)はあなたが探していることをしていませんか? – computerfreaker

+0

ベクトルはメモリを所有しているため、 "一方向スワップ"はありません。これが可能であれば、二重削除とヒープ破損の可能性があります。 –

答えて

0

あなたの質問は、あなたのvectormove()のコンパイル実装を作成する方法であれば、それはこのようなものだ:

// NOT USEFUL CODE 
void vectormove(std::vector<int>& a, std::vector<int>& b) 
{ 
    memcpy(&b, &a, sizeof(std::vector<int>)); 
} 

しかし、あなたはこれをやった後、あなたは未定義の動作へのパス上にあるため、これは、有用ではありません。おそらく、二重解放、おそらく使用-後フリーなど

あなたが最良の定期a.swap(b)するかのように、代わりにタイプint*としてaを格納することで、どちらか提供されますように思え:

std::vector<int> b(10000000,20); 
std::pair<int*, int*> a(&b[0], &b[b.size()]); 

今すぐ安価に渡すことができ、元のベクトルを参照してaを持っています。後でbを変更してaを無効にしないようにしてください。

1

abの内部を参照してください。それを行うための方法はただである:

std::vector<int>& a = b; 

あなたはaからテイクb以上の内部をしたい場合、それはです:にC++ 03がスワップとして実装することができ

std::vector<int> a = std::move(b); 

空のベクトルで:

std::vector<int> a; 
using std::swap; 
swap(a, b); 
関連する問題