根据inputdynamic二维数组

我需要从用户那里得到一个inputN并生成一个N * Nmatrix。 我怎样才能声明matrix? 一般来说,数组和matrix的大小应该在声明中是固定的,对吗? 那么vector<vector<int>>呢? 我从来没有使用过,所以我需要老兵的build议。

Boost在其uBLAS库中实现了matrix(支持math运算),并提供了如下的使用语法。

 #include <boost/numeric/ublas/matrix.hpp> int main(int argc, char* argv[]) { unsigned int N = atoi(argv[1]); boost::matrix<int> myMatrix(N, N); for (unsigned i = 0; i < myMatrix.size1 (); ++i) for (unsigned j = 0; j < myMatrix.size2 (); ++j) myMatrix(i, j) = 3 * i + j; return 0; } 

一个vector<vector<int> > (注意vector<vector<int> >的空格)可以很好地工作,但不一定是最有效的方法。 另一个可以很好地工作的是围绕单个向量的包装,它跟踪所表示的matrix的“形状”,并提供一个函数或重载操作符来访问数据:

 template <class T> class matrix { int columns_; std::vector<T> data; public: matrix(int columns, int rows) : columns_(columns), data(columns*rows) {} T &operator()(int column, int row) { return data[row*columns_+column]; } }; 

请注意,C ++标准只允许operator[]使用一个操作数,所以不能直接使用它来完成这项工作。 在上面的例子中,我明显地使用了operator() ,所以下标看起来更像Fortran或者BASIC,而不是你习惯的C ++。 如果你确实使用了[]符号,你可以做任何事情,尽pipe这是微不足道的(你在matrix类中重载它以返回代理,然后让代理类也重载operator[]来返回(引用到)正确的元素 – 它内部略微丑陋,但无论如何完美地工作)。

编辑:由于我躺在身边,这是一个如何实现后者的例子。 在大多数编译器包含std::vector之前,我写了这个(相当长的一段时间),所以静态分配一个数组而不是使用向量。 这也是3D案例(所以涉及到两层代理),但有一点运气,基本思想无论如何都来了:

 template<class T, int size> class matrix3 { T data[size][size][size]; friend class proxy; friend class proxy2; class proxy { matrix3 &m_; int index1_, index2_; public: proxy(matrix3 &m, int i1, int i2) : m_(m), index1_(i1), index2_(i2) {} T &operator[](int index3) { return m_.data[index1_][index2_][index3]; } }; class proxy2 { matrix3 &m_; int index_; public: proxy2(matrix3 &m, int d) : m_(m), index_(d) { } proxy operator[](int index2) { return proxy(m_, index_, index2); } }; public: proxy2 operator[](int index) { return proxy2(*this, index); } }; 

使用这个,你可以用普通的C ++语法来处理这个数组,比如:

 matrix3<double, size> m; for (int x=0; x<size; x++) for (int y = 0; y<size; y++) for (int z = 0; z<size; z++) m[x][y][z] = x*100 + y * 10 + z; 

示例代码:

 template<class T> class Array2D { public: Array2D(int a, int b) { num1 = (T**)new int [a*sizeof(int*)]; for(int i = 0; i < a; i++) num1[i] = new int [b*sizeof(int)]; for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { num1[i][j] = i*j; } } } class Array1D { public: Array1D(int* a):temp(a) {} T& operator[](int a) { return temp[a]; } T* temp; }; T** num1; Array1D operator[] (int a) { return Array1D(num1[a]); } }; int _tmain(int argc, _TCHAR* argv[]) { Array2D<int> arr(20, 30); std::cout << arr[2][3]; getchar(); return 0; } enter code here