向量返回空 C++

vector returning empty c++

本文关键字:C++ 返回 向量      更新时间:2023-10-16

我有一个问题,一些向量返回值是空的。以下是基本设置:

//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 是一个已经初始化并且包含数据的向量。我基本上只是尝试从该向量中获取两个值并使用此函数返回它们。但是,当我在调用 return 后以调试模式查看 toReturn 时,大小将重置为零,并且已复制的元素(我在返回调用之前检查过)不再在向量中。

我有一种感觉,这与返回时传递的浅副本有关。我尝试为 Foo 创建自己的复制构造函数,但是当它没有解决问题时,我删除了它。

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

因此,如果您有:

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

在getPair中调用return后,"toReturn"的内容现在将存在于"answerswer"中,而"toReturn"将为空。由于函数即将返回,因此无法进一步使用"toReturn",因此无需保留其内容。对于"答案"向量来说,只抓住"toReturn"向量的内脏比在"答案"中创建新元素并从"toReturn"复制每个元素更有效。

有关移动语义

的说明,请参阅此处:什么是移动语义?