【问题标题】:How can I return vector by reference in C++如何在 C++ 中通过引用返回向量
【发布时间】:2020-06-18 19:28:04
【问题描述】:

我想创建一个通过引用返回向量的函数。但是返回的向量(returned_v)与vec.v不同,而是一个复制的向量。这意味着向量是按值返回的。如何从vector_reference()获取引用向量?

class Vec {
  public:
    std::vector<int> v = {1, 2, 3};
    std::vector<int>& vector_reference() {
        return v;
    }
};

int main() {
    Vec vec;
    std::vector<int> returned_v = vec.vector_reference();
    returned_v.clear();
    std::cout << returned_v.size() << std::endl; // result: 0
    std::cout << vec.v.size() << std::endl; // result: 3

    return 0;
}

【问题讨论】:

  • 除了解决手头的问题,还有什么目的?培训?
  • 代码是简化版,让问题更清楚。 vector_reference() 用于根据实例的状态返回成员向量之一。
  • 好的。我没有得到问题描述。

标签: c++ vector pass-by-reference


【解决方案1】:

returned_v 是从vec.vector_reference() 的返回值复制而来的独立对象。您也应该将其声明为参考。

std::vector<int>& returned_v = vec.vector_reference();

【讨论】:

    【解决方案2】:

    函数vector_reference()中的引用是vec.v的引用。但是,returned_vvec.v 的副本,而不是它的引用。有两种方法可以帮助您:

    1. std::vector&lt;int&gt;&amp; returned_v = vec.vector_reference();

    2. std::vector&lt;int&gt; returned_v = std::move(vec.vector_reference()); //C++ 11

    【讨论】:

    • 请注意,在 #1 中,returned_vvec.v 本身的别名,而在 #2 中,returned_v 是一个单独的对象,它窃取了 vec.v 数据的所有权。微妙但重要的区别。
    猜你喜欢
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2014-12-11
    • 2013-07-07
    • 2011-03-14
    • 2019-05-06
    • 2012-02-13
    相关资源
    最近更新 更多