2010-07-30 70 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