一、二维数组

(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

最新文章

  1. [Java面试十]浏览器跨域问题.
  2. python学习笔记-Day6(3)
  3. 【POJ】2954 Triangle(pick定理)
  4. ZooKeeper Recipes and Solutions 翻译
  5. android初体验——HelloWord
  6. Session随便写的(抄书笔记)
  7. HW1.6
  8. &lt;item.../&gt;元素可指定如下常用属性
  9. BZOJ 2298 problem a(区间DP)
  10. 手提wifi双卡配置+window7同时多用户远程+有些公司限制网络环境方案
  11. exports和module.exports的区别
  12. (二十一)即时通信的聊天气泡的实现II
  13. 【Spark篇】---Spark中Shuffle文件的寻址
  14. Django模板语言
  15. AD域 组策略部署U软件
  16. Django2.0.1开发框架搭建
  17. Jmeter-使用Stepping Thread Group插件来设置负载场景
  18. Java将一个字符串的首位改为大写后边改为小写的实现,String
  19. WPF送走控件的focus方法
  20. LeetCode: Permutations 解题报告

热门文章

  1. My way to Python - Day03
  2. 最大流EK算法模板
  3. 基于VMware的eCos应用程序测试(hello wold)
  4. https://github.com/aptana/studio3/releases aptana
  5. 关于bootstrap列偏移的两种方式
  6. 学习第一个头文件stdio.h
  7. 本部校赛 蛇形填数(二)problen1338
  8. Linux上使用Azure CLI来管理Azure
  9. scheme I/0 输入输出操作
  10. 【转】如何定制android源码的编译选项 &amp; 后期安装? ---- 不错