2012-12-02 66 views
0

我如何使用std ::互換的載體複製到向量在結構?下面是我想要做的一個例子化std :: swap用的std ::向量在結構C++

#include<vector> 

using namespace std; 

struct test{ 
    vector<int> a; 
    vector<int> b; 
}; 

int main(){ 

    int data[] = { 1, 2, 3 }; 
    int data2[] = {3,4,5 }; 
std::vector<int> c(&data[0], &data[0]+sizeof(data)/sizeof(data[0])); 
std::vector<int> d(&data2[0], &data2[0]+sizeof(data2)/sizeof(data2[0])); 


    test A = test(swap(c) , swap(d)); 



} 
+4

首先,你沒有一個構造函數。其次,'std :: swap'有兩個參數,'std :: vector'有一個特殊的參數。另外,在C++ 11,可以只是這樣做來創建矢量:'的std ::矢量 13 C {1,2,3};' – chris

回答

3

你不能交換到構造函數或函數參數。你只能換成左值。這就是爲什麼C++ 11引入移動語義開始的原因之一:允許用戶明確地將對象移動到參數中等等。

所以你需要給test一個合適的構造函數,並調用它,使用std::move將你的左值vector對象轉換爲右值引用。

struct test{ 
    test(vector<int> _a, vector<int> _b) : a(std::move(_a)), b(std::move(_b)) {} 
    vector<int> a; 
    vector<int> b; 
}; 

... 

test A{std::move(c), std::move(d)}; 

如果你真的想副本的載體,你可以這樣做,而不是:

所有的
test A{c, d}; 
+0

應不rrefs所需的構造函數參數?這樣看起來它們是用移動的矢量構建的。即_a用移動的c構建,則a用移動的_a構建。 – zahir

+0

@zahir:是的,這正是它在做的。這樣,[無論你是移動還是副本完全取決於用戶。](http://stackoverflow.com/questions/8114276/how-do-i-pass-a-unique-ptr-argument-to -a-constructor-or-a-function/8114913#8114913)如果用戶想要複製,他們會傳遞一個左值。如果用戶想要移動,他們會傳遞一個右值。最好的部分是你不必編寫兩個構造函數。 –