向量返回空c ++

时间:2014-12-03 21:37:13

标签: c++ vector return return-value

我遇到一些问题,其中一些向量返回为空。以下是基本设置:

//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 个答案:

答案 0 :(得分:1)

编译器将优化您的代码,以便将toReturn向量移动到调用者的向量。

所以如果你有:

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

在getPair中调用return后,&#39; toReturn&#39;现在将生活在&#39;回答&#39;并且&#39; toReturn&#39;将是空的。由于该功能即将返回,因此不再使用&#39;返回&#39;是可能的,所以没有必要保留其内容。对于“答案”而言,它的效率更高。矢量,只是抓住&#39; toReturn&#39;矢量而不是创建新元素&#39;回答&#39;并将其中的每一个从&#39;复制到返回&#39;。

有关移动语义的解释,请参阅此处:What are move semantics?