在课堂上传递矢量而不复制

时间:2012-02-11 19:13:21

标签: c++ vector

我上课了:

someclass标题代码:

class SomeClass{
    SomeClass();
    vector<int> somePointerVector;

    public:
    SomeClass(vector<int> &someVector);
};

我对如何在这里使用向量感到有点困惑。我想设置somePointerVector = someVector,这样我就可以使用somePointerVector操作someVector中的数据与类的其他部分,我也不想复制所有someVectors数据。

使用数组我会用:

int* somePointerArray = someArray;

但是我怎么用矢量呢?

3 个答案:

答案 0 :(得分:4)

somePointerVector作为参考,并将其放入班级的initialization list。 (请给它一个更好的名字。)

class SomeClass
{
    vector<int> &somePointerVector;

  public:
    SomeClass(vector<int> &someVector)
      : somePointerVector(someVector)
    {}
};

答案 1 :(得分:2)

要了解最合适的解决方案,您需要了解“SomeClass”的生命周期和所有权以及它传递的向量。例如,如果SomeClass通过引用获取向量,那么构造SomeClass的代码需要确保向量的生命周期大于SomeClass的生命周期 - 否则SomeClass可能会以不再有效的引用结束。通过引用传递,SomeClass不是“取得所有权”的载体

或者,如果构造SomeClass的代码想要“切换”向量的责任(并且你有一个编译器和STL实现'r-value reference aware'),那么你可以传递一个r值参考向量;

class SomeClass { 
    vector<int> data_;

 public:
    SomeClass(vector<int>&& data) : data_(data) 
} 

然后构造SomeClass的代码;

vector<int> data;
data.push_back(1);
data.push_back(2);
data.push_back(3);
data.push_back(4);

SomeClass someClass(std::move(data));

在这种情况下,你已经将'向量'移动到SomeClass中以避免复制,而SomeClass已经“取得了对'数据'的所有权。”

答案 2 :(得分:0)

怎么样

class SomeClass {
    vector<int> myVector;

    void MyMethod(vector<int>* theVector);
}

并在您的方法中

void SomeClass::MyMethod(vector<int>* theVector)
{
    theVector->push_back(7);
}

自从我使用STL以来已经很久了,但我认为它是推送式的?

哦,使用指数你可以(* theVector)[2] ......