如何在 C++ 中通过引用返回向量

How can I return vector by reference in C++

提问人:dolgom 提问时间:3/6/2020 更新时间:3/6/2020 访问量:1339

问:

我想制作一个通过引用返回向量的函数。但返回的 vector() 与 不同,而是一个复制的向量。这意味着向量是按值返回的。如何从 ?returned_vvec.vvector_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;
}
C++ 矢量 按引用传递

评论

0赞 Ted Lyngmo 3/6/2020
除了解决手头的问题,还有什么目的?训练?
0赞 dolgom 3/6/2020
该代码是简化版本,以明确问题。vector_reference() 用于根据实例的状态返回其中一个成员向量。
0赞 Ted Lyngmo 3/6/2020
还行。我没有得到问题描述。

答:

6赞 songyuanyao 3/6/2020 #1

returned_v是一个独立的对象,它从 的返回值复制。您也应该将其声明为引用。vec.vector_reference()

std::vector<int>& returned_v = vec.vector_reference();
0赞 alexzhu 3/6/2020 #2

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

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

  2. std::vector<int> returned_v = std::move(vec.vector_reference()); //C++ 11

评论

0赞 Remy Lebeau 3/6/2020
请注意,在 #1 中,是自身的别名,而在 #2 中,是一个单独的对象,它窃取了数据的所有权。微妙但重要的区别。returned_vvec.vreturned_vvec.v