从c ++向量中提取引用

时间:2010-04-28 08:18:34

标签: c++ reference vector copy

我有一个vector< vector< vector< int>>>,我想从中提取一个vector< vector< int>>来单独处理它。

问题在于我写的时候:

myMatrix = myCube[anIndex];

矩阵被复制但我只想要一个参考以节省内存。 你能帮帮我吗?

非常感谢!

6 个答案:

答案 0 :(得分:2)

只需使用

vector<vector<int> >& myMatrix = myCube[anIndex]; 

答案 1 :(得分:1)

使用vector< vector< int> >::const_iterator类型的迭代器。希望这会有所帮助。

答案 2 :(得分:1)

vector::operator[]返回一个引用 - 只要您将该结果存储到引用而不是完整的对象中,就应该避免复制。

vector< vector<int > >& myMatrix = myCube[anIndex];

答案 3 :(得分:0)

如果myMatrix是一个类成员,并且您希望能够在构造函数之外初始化它,那么您唯一的选择是使用指针:

class Whatever
{
  //...
  vector<vector<int>>* myMatrix;
  //...
}

  myMatrix = &myCube[anIndex]

编辑:如果你可以在构造函数中初始化myMatrix,你可以使用引用:

class Whatever
{
  //...
  vector<vector<int> >& myMatrix;
  //...
}

Whatever::Whatever(vector<vector<vector<int> > >& myCube), int anIndex)
: myMatrix(myCube[anIndex])
{
  //...
}

顺便说一句,您必须在代码中分隔>,除非您使用符合C ++ 0x的编译器;否则,编译器会将>>解析为operator>>并给您一个错误。

答案 4 :(得分:0)

使用函数返回迭代器作为advance,而不是使用operator [],而是将矩阵声明如下

vector< vector< int> >::iterator myMatrixPtr;

myMatrixPtr = std::advance(myCube, anIndex);

现在您可以使用myMatrixPtr,就好像它是一个指针一样。如果您更喜欢参考,可以在初始化后初始化一个

vector< vector<int > >& myMatrix = *myMatrixPtr;

答案 5 :(得分:0)

小心会员推荐!如果在MyClass实例之前清理了引用的对象,则将具有无效引用。通常(但并非总是),如果您发现需要使用成员参考,那么这是一个早期警告标志,您的设计可以得到改进。除了作为对象所有者的句柄之外,我很少使用成员引用,在那里我可以绝对确定引用的对象将比引用更长。

如果你略微改变你的班级责任,这可能会有所帮助。现在,您正在构建一组数据,然后创建一个传递该组数据的对象。相反,为什么不首先构建对象,然后将数据直接放入其中。

// To start, define your class to allow you to build up the data
class MyMatrix
{
public:
  MyMatrix ()
    { }

  void  setData (int x, int y, int data)
    { this->myData [x][y] = data; }
  int   getData (int x, int y)
    { return this->myData [x][y]; }

private:
  vector<vector<int> > myData; 
} 

// Then, create a vector of 6 (or however many you need) matrices
int numberOfMatrices = 6;
vector<MyMatrix> myCube (numberOfMatrices);

// Then, fill in the vector
for (int matrixIndex = 0; matrixIndex < numberOfMatrices; matrixIndex++)
  {
  // Fill in the data for this matrix
  MyMatrix &currentMatrix = myCube [matrixIndex];

  currentMatrix.setData (0 /* x */, 0 /* y */, 0 /* data */);
  // ... rest of data
  }

然后,您已拥有对象中的所有数据,随时可以根据需要进行处理。另外,每个对象拥有其数据,因此只要对象在周围,其成员数据就是有效的。最重要的是,使用具有有用命名成员函数的对象将使您的代码比大量嵌套容器更自我记录。