数据结构算法应用C++语言描述——(1)C++基础知识
一、二维数组
(1)二维数组的列是固定时,行未知时使用动态分配
当一个二维数组每一维的大小在编译时都是已知时,可以采用类似于创建一维数组的语法
来创建二维数组。例如,一个类型为char的7×5数组可用如下语法来定义:
char c[7][5];
如果在编译时至少有一维是未知的,必须在运行时使用操作符new来创建该数组。一个二
维字符型数组,假定在编译时已知其列数为5,可采用如下语法来分配存储空间:
#include<exception> #include<iostream> using namespace std; void main() { int n=10; char (*c)[5]; //c为一指向char[5] 数组类型的指针 try { c = new char [n][5]; }catch (bad_alloc) { //仅当new失败时才会进入 cerr << "Out of Memory" << endl; exit (1); } }
(2)动态创建二维数组,删除动态创建的二维数组,修改动态创建的一维数组和二维数组的大小
#ifndef make2DArray #define make2DArray #include<exception> #include<iostream> using namespace std; /* 动态创建二维数组 */ template<class T> bool Make2DArray(T** &inputArray,int rows,int cols){ //注意此处是一个T**二重指针的引用,否则会发生形参复制,创建的二维数组不可用 try{ inputArray=new T*[rows]; //创建一个T*类型的数组,该数组含有rows个元素([]操作符的优先级高于*) for(int i=0;i<rows;i++){ inputArray[i]=new T[cols]; } return true; }catch(bad_alloc){ return false; } } /* 删除动态创建的二维数组 */ template <class T> void Delete2DArray(T** &inputArray,int rows){ for(int i=0;i<rows;i++){ delete[] inputArray[i]; //数组中的每个元素都相当于一个指针(还是一个数组) } delete [] inputArray; } /* 改变动态创建的一维数组的大小 */ template<class T> bool ChangeSize1D(T* &srcArray,int srcSize,int dstSize) { try{ T *dstArr=new T[dstSize]; //实现对重新分配的数组元素的初始化 for(int i=0;i<dstSize;i++){ if(srcSize>dstSize){ //减小数组的容量 dstArr[i]=srcArray[i]; }else{ //增加数组的容量 if(i<srcSize){ dstArr[i]=srcArray[i]; }else{ dstArr[i]=T(); //使用T默认的构造函数进行初始化 } } } delete [] srcArray; srcArray=dstArr; return true; }catch(bad_alloc){ return false; } } /* 改变动态创建的一维数组的大小 */ template<class T> bool ChangeSize2D(T** &srcArray,int srcRows,int srcCols,int dstRows,int dstCols){ try{ //首先分配目标内存 T** dstArr; dstArr=new T* [dstRows]; //将二维指针看成是一个存放指针(由一行元素组成的数组)的数组 for(int i=0;i<dstRows;i++){ dstArr[i]=new T[dstCols]; //为数组中存放的每一个指针,再分配一个数组 } //实现对重新分配的数组元素的初始化 for(int i=0;i<dstRows;i++){ for(int j=0;j<dstCols;j++){ if(i<srcRows && j<srcCols){ dstArr[i][j]=srcArray[i][j]; }else{ dstArr[i][j]=T(); //使用默认构造函数进行初始化 } } } //删除原动态分配的数组srcArray for(int i=0;i<srcRows;i++){ delete[] srcArray[i]; //删除每一行的数组 } delete[] srcArray; //删除存储每一行指针的数组 //为原数组重新设置指向 srcArray=dstArr; return true; }catch(bad_alloc){ return false; } } #endif
henry