65.9K
CodeProject 正在变化。 阅读更多。
Home

C++ 中的动态二维数组简介

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.71/5 (15投票s)

2007 年 12 月 7 日

CPOL
viewsIcon

343209

C++ 中动态二维数组的介绍。

引言

动态数组是一种可以调整大小的数据结构,允许添加或删除元素。

在 C++ 中创建动态二维数组有很多种方法。

1. 指向指针的指针

首先,我们将为包含一组指针的数组分配内存。 接下来,我们将为指针指向的每个数组分配内存。 内存的释放顺序与内存分配的顺序相反。

int **dynamicArray = 0;

//memory allocated for elements of rows.


dynamicArray = new int *[ROWS] ;

//memory allocated for  elements of each column.


for( int i = 0 ; i < ROWS ; i++ )
dynamicArray[i] = new int[COLUMNS];

//free the allocated memory


for( int i = 0 ; i < ROWS ; i++ )
delete [] dynamicArray[i] ;
delete [] dynamicArray ;

上面的代码是针对整数值而言的。 我们可以使用模板来操作通用类型。 在下面的示例中,对于内存分配,使用了 AllocateDynamicArray 函数模板,而对于释放内存,使用了 FreeDynamicArray

template <typename T> 
T **AllocateDynamicArray( int nRows, int nCols)
{
      T **dynamicArray;

      dynamicArray = new T*[nRows];
      for( int i = 0 ; i < nRows ; i++ )
      dynamicArray[i] = new T [nCols];

      return dynamicArray;
}

template <typename T>
void FreeDynamicArray(T** dArray)
{
      delete [] *dArray;
      delete [] dArray;
}

int main()
{
      int **my2dArr = AllocateDynamicArray<int>(4,4);
      my2dArr[0][0]=5;
      my2dArr[2][2]=8;
      cout << my2dArr[0][0] << my2dArr[0][1] << endl;
      cout << my2dArr[1][1] <<  my2dArr[2][2]<< endl;
  
      FreeDynamicArray<int>(my2dArr);
      return 0;
}

2. 向量的向量

可以使用一行代码通过使用向量的向量(即包含向量数组的向量)来完成上述代码。

vector<vector<T> > dynamicArray(ROWS, vector<T>(COLUMNS));

#include <vector>

using namespace std;

#define ROWS  4
#define COLUMNS  4

//vector<int > vec(5, 7); create a vector with 
//5 elements and each element will have the value 7.


vector<vector<int> > dynamicArray(ROWS, vector<int>(COLUMNS));

for(int i = 0;i < dynamicArray.size();++i)
{
      for(int j = 0;j < dynamicArray[i].size();++j)
      {
           dynamicArray[i][j] = i*j;
      }
}
 
for(int i = 0;i < dynamicArray.size();++i)
{           
     for(int j = 0;j < dynamicArray[i].size();++j)
     {
          cout << dynamicArray[i][j] << endl;
     }
}

3. 向量包装类

我们创建了一个包装类 DynamicArray,其中包含一个 vector<vector<T> > dArray 数据成员。 然后,我们将行数和列数作为参数传递给构造函数。

template <typename T>
class DynamicArray
{
public:
    DynamicArray(){};

    DynamicArray(int rows, int cols): dArray(rows, vector<T>(cols)){}

    vector<T> & operator[](int i) 
    { 
      return dArray[i];
    }
    const vector<T> & operator[] (int i) const 
    { 
      return dArray[i];
    }
    void resize(int rows, int cols)//resize the two dimentional array .


    {
        dArray.resize(rows);
        for(int i = 0;i < rows;++i) dArray[i].resize(cols);
    }
private:
    vector<vector<T> > dArray;  
};

void Matrix(int x, int y)
{
    DynamicArray<int> my2dArr(x, y);
    my2dArr[0][0] = -1;
    my2dArr[0][1] = 5;
    cout << my2dArr[0][0] << endl;
    cout << my2dArr[0][1]  << endl;
}

int main(){

 Matrix(2,2);
 return 0;
}
© . All rights reserved.