如何从方法返回std::vector,而不是每次都是副本

How to return a std::vector from a method and not have it be a copy every time?

本文关键字:副本 vector 方法 返回 std      更新时间:2023-10-16

我很确定这是一些指针业务,但我已经离开c++一段时间了。

基本上,我有一个具有方法getVector()的类,该方法返回它存储为类变量的std::vector

我想访问这些元素,但不是每次调用getVector()时复制整个向量。正确的做法是什么?存储为类变量的vector本身不是指针。

向vector返回引用

  1. 如果调用作用域应该能够修改vector:

    class MyClass {
        std::vector<foo> v;
      public:
        std::vector<foo>& getVector() {
           return v;
        }
    };
    
  2. 如果调用作用域不需要修改vector:

    class MyClass {
        std::vector<foo> v;
      public:
        const std::vector<foo>& getVector() const {
           return v;
        }
    };
    

都是完全"安全"的,因为vector不是函数作用域的局部。

好吧,如果调用代码可以访问向量,为什么向量是私有属性?如果将其作为公共属性,那么就不需要getVector()方法了,是吗?

如果出于某种充分的理由希望vector为私有属性,则不应该提供这种开放访问,而应该提供适当修改私有数据的方法。

在保持vector私有的同时,最接近于提供开放访问的方法是提供对迭代器

的访问。
typedef std::vector<foo>::iterator iterator_foo
iterator_foo begin_foo() { return v.begin(); }
iterator_foo end_foo() { return v.end(); }

你可以这样使用

MyClass::iterator_foo ifoo = std::find(
   theclass.begin_foo(), theclass.end_foo(), foo_target );
if ( ifoo != theclass.end_foo() ) {
   cout << "found it" << endl;
   ....