2014-12-03 61 views
1

我遇到了一些向量返回值为空的问题。以下是基本设置:向量返回空C++

//Foo.h 
struct Foo{ 
    int n; 
    double vals[2]; 
}; 

//MyClass.h 
class MyClass{ 
private: 
    std::vector<Foo> classVector; 
public: 
    std::vector<Foo> getPair(int i1, int i2); 
}; 

//MyClass.cpp 
std::vector<Foo> MyClass::getPair(int i1, int i2) 
{ 
    std::vector<Foo> toReturn(2); 
    toReturn[0] = classVector[i1 - 1]; 
    toReturn[1] = classVector[i2 - 1]; 
    return toReturn; 
} 

classVector是一个已经初始化并且包含数据的向量。我基本上只是试图从该向量中获取两个值,并使用此函数返回它们。但是,当我调用返回值时,在调试模式下返回时,大小将重置为零,并且已复制过的元素(我在返回调用之前检查过)不再位于向量中。

我有一种感觉,它必须做一个浅拷贝被传回来。我尝试为Foo创建自己的拷贝构造函数,但是当它没有解决问题时我删除了它。

+1

'返回的std ::矢量(classVector.begin(),classVector.begin()+ 2);' – Borgleader 2014-12-03 21:39:34

+1

@Borgleader坦率地说,'返回make_pair (...' – 2014-12-03 21:40:02

+0

我会尝试make_pair。另一个建议不起作用,因为元素不一定是按顺序排列的 – ewpcasey 2014-12-03 21:41:27

回答

1

编译器将优化您的代码,以便将vector返回给调用者的向量。

所以,如果您有:回报称为getPair

void someFunc(MyClass& my) 
{ 
    vector<Foo> answer = my.getPair(3,4); 
} 

后,“toReturn”现在生活在“答案”和“toReturn”的内容将是空的。当函数即将返回时,不可能再使用'toReturn',因此不需要保留其内容。对于'回答'矢量来说,只需抓住'toReturn'矢量的内涵,而不是在'answer'中创建新元素并从'toReturn'中复制每个元素,效率更高。

对于移动语义的说明,请参见此处:What are move semantics?