2012-12-02 28 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)如果用户想要复制,他们会传递一个左值。如果用户想要移动,他们会传递一个右值。最好的部分是你不必编写两个构造函数。 –