2010-04-28 67 views
0

我有一個vector< vector< vector< int>>>,我想從中提取一個vector< vector< int>>來單獨處理它。從C++向量中提取參考

的問題是,當我寫:

myMatrix = myCube[anIndex]; 

矩陣被複制,但我只是想爲了節省內存的引用。 你能幫我一下嗎?

非常感謝!

+0

我添加了內聯代碼格式到您的問題。看看源代碼,看看你下次如何自己做。這也適用於評論。一般來說,您應該通過編輯而不是在評論中提供額外的信息到您的問題中。這有助於他人獲得所有相關信息,而無需閱讀所有答案的所有評論。 – 2010-04-28 09:14:37

回答

1

使用vector< vector< int> >::const_iterator類型的迭代器。希望這可以幫助。

1

vector::operator[]返回一個引用 - 只要您將該結果存儲到引用而不是完整對象中,則應避免複製。

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

只需使用

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

謝謝你(非常快:))的答案。 但在我的情況下,myMatrix實際上是一個類成員,所以如果它是一個引用,它必須在構造函數中初始化。 – Archanimus 2010-04-28 08:23:54

+0

@Archanimus:只要「myMatrix」是一個實例的類有一個重載,並且需要適當的引用,那應該沒問題。 – 2010-04-28 08:26:12

+0

@Archanimus:目前在構造函數中初始化了什麼?您可以在構造函數的初始化程序列表中使用'[]'表達式(例如'myCube [anIndex]')。不管你做什麼,參考都不能反彈。 – 2010-04-28 08:27:49

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>>並給出錯誤。

+0

這是一個解決方案,但會導致可維護性的問題,我已經有很多代碼引用myMatrix實際上,我認爲只有一個引用被複制,直到發現內存使用量巨大! – Archanimus 2010-04-28 08:40:36

+0

@Archanimus:好的,你不能在非引用的非指針變量中存儲引用,使用引用會迫使你把它初始化到你的類構造函數的初始化列表中,以及其他任何地方;如果你可以接受它,那麼就使用一個引用,我會更新我的答案以反映它 – Gorpik 2010-04-28 08:53:47

0

而不是使用返回迭代器作爲提前operator []的使用功能,並宣佈矩陣如下

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

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

現在你可以用myMatrixPtr的工作就好像它是一個指針。如果你喜歡參考,你可以初始化一個初始化後

vector< vector<int > >& myMatrix = *myMatrixPtr; 
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 
    } 

然後,您將所有數據都包含在對象中,隨時可以根據需要進行處理。另外,每個對象都擁有它的數據,所以只要對象在附近,其成員數據就會有效。最重要的是,使用具有有用名稱成員函數的對象將使您的代碼比大量的嵌套容器更加自我記錄。

+0

非常感謝你的所有解釋國家 !其實,我完全同意你的觀點,幸好在我的情況下,我確信數據不會丟失。我的設計是通過解耦我的類來激發的,因爲'日期的來源可能是不同的東西。 – Archanimus 2010-04-29 12:16:11