从 C++ 向量中提取引用
Posted
技术标签:
【中文标题】从 C++ 向量中提取引用【英文标题】:Extracting a reference from a c++ vector 【发布时间】:2010-04-28 08:18:33 【问题描述】:我有一个vector< vector< vector< int>>>
,我想从中提取一个vector< vector< int>>
来单独处理它。
问题是我写的时候:
myMatrix = myCube[anIndex];
矩阵被复制,但我只想要一个参考以节省内存。 你能帮帮我吗?
非常感谢!
【问题讨论】:
我在您的问题中添加了内联代码格式。看看源代码,看看你下次如何自己做。这也适用于 cmets。通常,您应该通过编辑将额外信息放入您的问题中,而不是在 cmets 中。这有助于其他人获得所有相关信息,而无需阅读所有 cmets 的所有答案。 【参考方案1】:随便用
vector<vector<int> >& myMatrix = myCube[anIndex];
【讨论】:
感谢您(非常快:))的回答。但在我的例子中,myMatrix 实际上是一个类成员,所以如果它是一个引用,它必须在构造函数中初始化。 @Archanimus:这应该没问题,只要myMatrix
是一个实例的类有一个需要适当引用的重载。
@Archanimus:它当前在构造函数中初始化为什么?您可以在构造函数的初始化列表中使用[]
表达式(例如myCube[anIndex]
)。但是,无论您做什么,引用都不能被反弹。
@Archanimus,没错。但是你需要使用初始化列表。
好吧,我在类 myMatrix 中声明为对向量向量的引用,并以这种方式初始化它 MyClass() : myMatrix() 当我尝试时: myMatrix = myCube[anIndex]我收到此消息:程序接收信号:“EXC_BAD_ACCESS”。 ??? ps:对不起格式,我还不知道如何将部分文本声明为代码... -_-"【参考方案2】:
使用vector< vector< int> >::const_iterator
类型的迭代器。希望这会有所帮助。
【讨论】:
【参考方案3】:vector::operator[]
返回一个引用 - 只要您将该结果存储到一个引用而不是一个成熟的对象中,您就应该避免复制。
vector< vector<int > >& myMatrix = myCube[anIndex];
【讨论】:
【参考方案4】:如果 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>>
并给你一个错误。
【讨论】:
这是一个解决方案,但会导致可维护性问题,我已经有很多引用 myMatrix 的代码。其实我以为只是复制了一个引用,直到发现内存使用量很大! @Archanimus:好吧,您不能将引用存储在非引用、非指针变量中。使用引用会迫使您在类构造函数的初始化列表中初始化它,而不是其他任何地方;如果您可以忍受,请使用参考。我会更新我的答案以反映它。【参考方案5】:不要使用运算符[],而是使用返回迭代器的函数作为提前,并声明矩阵如下
vector< vector< int> >::iterator myMatrixPtr;
myMatrixPtr = std::advance(myCube, anIndex);
现在您可以像使用指针一样使用 myMatrixPtr。如果您更喜欢引用,则可以在此初始化后初始化一个
vector< vector<int > >& myMatrix = *myMatrixPtr;
【讨论】:
【参考方案6】:注意成员引用!如果在 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 ¤tMatrix = myCube [matrixIndex];
currentMatrix.setData (0 /* x */, 0 /* y */, 0 /* data */);
// ... rest of data
然后,您的对象中已经有了所有数据,可以根据需要进行处理。另外,每个对象都拥有自己的数据,所以只要对象在身边,其成员数据就有效。最重要的是,使用具有有用命名成员函数的对象将使您的代码比大量嵌套容器更具自文档性。
【讨论】:
非常感谢您的所有解释!实际上,我完全同意你的看法,幸运的是,就我而言,我很确定数据不会丢失。我的设计是通过解耦我的类来激发的,因为'日期的来源可以是不同的东西。以上是关于从 C++ 向量中提取引用的主要内容,如果未能解决你的问题,请参考以下文章