【问题标题】:vector returning empty c++向量返回空 C++
【发布时间】:2015-02-01 15:09:43
【问题描述】:

我遇到了一些向量返回为空的问题。这是基本设置:

//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 时,大小将重置为零,并且已复制的元素(我在 return 调用之前检查过)不再在向量中。

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

【问题讨论】:

  • return std::vector&lt;Foo&gt;(classVector.begin(), classVector.begin() + 2);
  • @Borgleader 坦率地说,return make_pair(...
  • 我会尝试 make_pair。另一个建议不起作用,因为元素不一定按顺序排列。
  • 但是你的问题是什么?你按值返回,所以返回的时候局部向量 toReturn 会被销毁,它的内容会被复制!
  • 一如既往地发布 mcve,您的问题是您误解了在调试器中看到的内容,而不是浅拷贝、拷贝 ctor 等。

标签: c++ vector return return-value


【解决方案1】:

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

如果你有:

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

在 getPair 中调用 return 后,'toReturn' 的内容现在将存在于 'answer' 中,而 'toReturn' 将为空。由于函数即将返回,因此无法进一步使用 'toReturn',因此无需保留其内容。 'answer' 向量只获取 'toReturn' 向量的内容而不是在 'answer' 中创建新元素并从 'toReturn' 复制每个元素会更有效。

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

【讨论】:

    猜你喜欢
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2018-10-12
    相关资源
    最近更新 更多