2010-07-30 71 views
1

如建議here我修復了我的二維數組數組,使它與Vector類一起工作。C++ - 基於矢量的二維物體陣列

頭文件

#include <vector> 

typedef std::vector<int> Array; 
typedef std::vector<Array> TwoDArray; 

這裏是如何使用它:

TwoDArray Arr2D; 

// Add rows 
for (int i = 0; i < numRows; ++i) { 
    Arr2D.push_back(Array()); 
} 

// Fill in test data 
for (int i = 0; i < numRows; i++) {  
    for (int j = 0; j < numCols; j++) { 
     Arr2D[i].push_back(ofRandom(0, 10));   
    } 
} 

// Make sure the data is there 
for (int i = 0; i < numRows; i++) {  
    for (int j = 0; j < numCols; j++) { 
     std::cout << Arr2D[i][j] << ' '; 
    } 
std::cout << '\n'; 
} 

我的問題是,我該怎麼做同樣的自定義對象,而不是INT號碼?我已經嘗試了通過MyObject更改int並使用push_back(new MyObject());但是當我嘗試訪問它的功能時它不能正常工作。

預先感謝您。

+1

究竟出了什麼問題? – 2010-07-30 11:43:44

+2

嘗試給出不起作用的代碼片段和錯誤 - 也許我們可以看到一些東西。 – 2010-07-30 11:43:50

回答

1

new MyObject()將返回指針到新創建的類MyObject的實例。如果您創建了vector<MyObject>,那麼您需要執行一些操作,如push_back(MyObject())

+1

+1容易犯的錯誤,如果你來自說一個Java背景。 – 2010-07-30 13:34:39

0

您需要更改

typedef std::vector<int> Array; 
typedef std::vector<Array> TwoDArray; 

typedef std::vector<MyObject> Array; 
typedef std::vector<Array> TwoDArray; 
0

在大綱:

struct MyObject {}; 

typedef std::vector<MyObject> Array; 
typedef std::vector<Array> TwoDArray; 

// stuff 

Arr2D[i].push_back(MyObject()); 

注意,要存放東西的載體必須可拷貝和分配。

1

試試這個:

template<class T> 
struct Array2D { 
    vector<vector<T>> Array; 
}; 

現在,您可以在申報任何物品,像這樣

Array2D<MyObject>::Array array; 

甚至

Array2D<MyObject*>::Array array; 

,並與你的一天正常開展... 。

Be a當你將一個對象分配給它應該實現的stl容器時,默認的無參數構造函數,複製構造函數和重載操作符=(const和非const),否則你應該插入一個指向該對象的指針。

1

如果我是你,我會使用指針數組而不是對象本身(但是在執行「clear()」之前,你將不得不考慮釋放)。

typedef std::vector<std::vector<myObject* > > 2DArray; 

2DArray A; 
for (int i=0; i<numRows;++i) A.push_back(std::vector<myObject* >(numColumns)); 

myObject* M = new myObject(...); 
A[row][column] = M; 
1

既然你正在尋找最好的設計方法,爲什麼不遵循C++ FAQ Lite的建議,使您的密集陣(而不是衣衫襤褸)。你不希望必須處理不同大小的行,是嗎?

#include <iostream> 
#include <random> 
#include <vector> 

template<typename T> 
class TwoDArray { 
     std::vector<T> data; 
     const size_t cols; 
public: 
     TwoDArray(size_t R, size_t C) : data(R*C), cols(C) {} 
     T operator()(size_t r, size_t c) const { return data[cols*r+c]; } 
     T& operator()(size_t r, size_t c) { return data[cols*r+c]; } 
}; 

int main() 
{ 
     // Make it 
     const size_t numRows = 10; 
     const size_t numCols = 10; 
     TwoDArray<int> Arr2D(numRows, numCols); 

     // Fill in test data 
     std::random_device rd; 
     std::mt19937 eng(rd()); 
     std::uniform_int_distribution<> unif(0,9); 
     for (size_t i=0; i<numRows; ++i) 
      for (size_t j=0; j<numCols; ++j) 
       Arr2D(i,j) = unif(eng); 

     // Make sure the data is there 
     for (size_t i = 0; i < numRows; i++) { 
      for (size_t j = 0; j < numCols; j++) { 
       std::cout << Arr2D(i,j) << ' '; 
      } 
      std::cout << '\n'; 
     } 

} 

或者你可以甚至使類型的大小一部分,就像std::array