zoukankan      html  css  js  c++  java
  • 如何在C++中使用动态三维数组

    1. 使用new和delete来构造

    在使用new申请内存时,在使用过后,一定要采用delete来进行释放内存。
    使用该方法创建动态数组时,需要由数组的角标依次向右进行创建;
    同时,也需要依照角标,从左到右来进行删除。

    代码功能为:声明三维动态数组,将角标和进行相加并添加到mfc的list中,然后释放内存。
    具体代码如下

    //声明三维数组,长处分别为X_Length,Y_Length,Z_Length
    
    	int X_Length = 5, Y_Length = 6, Z_Length = 7;//长度定义
    
    	double ***DD;//声明指针
    	DD = new double **[X_Length];//定义X的长度
    
    	for (int x = 0;x < X_Length; x++)//在X的内部,定义Y
    	{
    		DD[x] = new double *[Y_Length];//定义Y的长度
    
    		for (int y = 0; y < Y_Length; y++)//在xy的内部,定义Z
    		{
    			DD[x][y] = new double [Z_Length];//定义Z的长度
    		}
    	}
    
    	//数组的声明完成,可以对数组进行操作
    	//比如将数组的角标的和,并显示在表格中
    	int count_number = 0;
    
    	for (int i = 0;i < X_Length; i++)
    	{
    		for (int j = 0; j < Y_Length; j++)
    		{
    			for (int k = 0; k < Z_Length; k++)
    			{
    				DD[i][j][k] =  i + j + k;
    				CString temp;
    				m_list.InsertItem(count_number,_T(""));
    				
    
    				temp.Format(_T("%d"),count_number+1);m_list.SetItemText(count_number,0,temp);
    				temp.Format(_T("%d"),i);m_list.SetItemText(count_number,1,temp);
    				temp.Format(_T("%d"),j);m_list.SetItemText(count_number,2,temp);
    				temp.Format(_T("%d"),k);m_list.SetItemText(count_number,3,temp);
    				temp.Format(_T("%f"),DD[i][j][k]);m_list.SetItemText(count_number,4,temp);
    				count_number++;
    			}
    		}
    	}
    
    	//用完数组后,用delete将内存释放
    	for (int x = 0; x < X_Length; x++)
    	{
    		for (int y = 0; y < Y_Length; y++)
    		{
    			delete [] DD[x][y];//释放Z这一层
    		}
    	}
    	for (int x = 0; x < X_Length; x++)
    	{
    		delete [] DD[x];//释放Y这一层
    	}
    	delete [] DD;//释放X这一层
    

    在进行生成数组时,一定要弄清楚x、y、z之间的关系。

    2. 使用malloc和free来构造

    malloc memory中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存

    使用思路和new相同,都是先申请内存,然后使用,使用结束后释放内存。

    // 用malloc 和 free来生成三维动态数组
    	int X_Length = 5, Y_Length = 10, Z_Length = 7;//长度定义
    
    	double ***DD;//声明指针
    	DD = (double***)malloc(sizeof(double**)*X_Length);//X的长度
    	for (int x = 0; x < X_Length; x++)
    	{
    		DD[x] = (double **)malloc(sizeof(double*)*Y_Length);//Y的长度
    		for (int y = 0;y < Y_Length;y++)
    		{
    			DD[x][y] = (double *)malloc(sizeof(double)*Z_Length);//Z的长度
    		}
    	}
    
    	//数组的声明完成,可以对数组进行操作
    	//比如将数组的角标的和,并显示在表格中
    	int count_number = 0;
    
    	for (int i = 0;i < X_Length; i++)
    	{
    		for (int j = 0; j < Y_Length; j++)
    		{
    			for (int k = 0; k < Z_Length; k++)
    			{
    				DD[i][j][k] =  i + j + k;
    				CString temp;
    				m_list.InsertItem(count_number,_T(""));
    
    
    				temp.Format(_T("%d"),count_number+1);m_list.SetItemText(count_number,0,temp);
    				temp.Format(_T("%d"),i);m_list.SetItemText(count_number,1,temp);
    				temp.Format(_T("%d"),j);m_list.SetItemText(count_number,2,temp);
    				temp.Format(_T("%d"),k);m_list.SetItemText(count_number,3,temp);
    				temp.Format(_T("%f"),DD[i][j][k]);m_list.SetItemText(count_number,4,temp);
    				count_number++;
    			}
    		}
    	}
    
    
    	//用完数组后,用free将内存释放
    	for (int x = 0; x < X_Length; x++)
    	{
    		for (int y = 0; y < Y_Length; y++)
    		{
    			free(DD[x][y]);//释放Z
    		}
    	}
    	for (int x = 0; x < X_Length; x++)
    	{
    		free(DD[x]);//释放Y
    	}
    	free(DD);//释放X
    

    3.构造函数来生成数组

    从1、2中的例子可以看出,每次使用数组时,需要声明数组和释放内存,操作特别繁琐,因此可以将其写成子函数的形式,来简化操作。

    3.1 声明数组函数

    double ***CtestdataDlg::Shuzu(int X_Length,int Y_Length,int Z_Length)
    {
    	double ***DD;//声明指针
    	DD = new double **[X_Length];//定义X的长度
    
    	for (int x = 0;x < X_Length; x++)//在X的内部,定义Y
    	{
    		DD[x] = new double *[Y_Length];//定义Y的长度
    
    		for (int y = 0; y < Y_Length; y++)//在xy的内部,定义Z
    		{
    			DD[x][y] = new double [Z_Length];//定义Z的长度
    		}
    	}
    	return DD;
    }
    

    3.2 释放内存函数

    void CtestdataDlg::DeleteShuzu(double ***DD,int X_Length,int Y_Length,int Z_Length)
    {
    	//用完数组后,用delete将内存释放
    	for (int x = 0; x < X_Length; x++)
    	{
    		for (int y = 0; y < Y_Length; y++)
    		{
    			delete [] DD[x][y];//释放Z这一层
    		}
    	}
    	for (int x = 0; x < X_Length; x++)
    	{
    		delete [] DD[x];//释放Y这一层
    	}
    	delete [] DD;//释放X这一层
    }
    

    3.3 应用函数

    void CtestdataDlg::OnBnClickedButton3()
    {
    	
    	m_list.DeleteAllItems();
    
    	int X_Length = 5, Y_Length = 4, Z_Length = 3;
    	double ***DD = Shuzu(X_Length,Y_Length,Z_Length);//构造数组
    
    	int count_number = 0;
    
    	for (int i = 0;i < X_Length; i++)
    	{
    		for (int j = 0; j < Y_Length; j++)
    		{
    			for (int k = 0; k < Z_Length; k++)
    			{
    
    				DD[i][j][k] =  i + j + k;
    				CString temp;
    				m_list.InsertItem(count_number,_T(""));
    				temp.Format(_T("%d"),count_number+1);m_list.SetItemText(count_number,0,temp);
    				temp.Format(_T("%d"),i);m_list.SetItemText(count_number,1,temp);
    				temp.Format(_T("%d"),j);m_list.SetItemText(count_number,2,temp);
    				temp.Format(_T("%d"),k);m_list.SetItemText(count_number,3,temp);
    				temp.Format(_T("%f"),DD[i][j][k]);m_list.SetItemText(count_number,4,temp);
    				count_number++;
    			}
    		}
    	}
    	//释放内存
    	DeleteShuzu(DD,X_Length,Y_Length,Z_Length);
    }
    
  • 相关阅读:
    Linux常用命令(5)--SSH访问远程服务器、SCP服务器间文件拷贝
    【转载】善用工具(1)--Mac版UltraEdit编辑器破解方法
    Linux常用命令(4)--善用"help"、"man在线帮助文档",轻松搞定系统命令
    Linux常用命令(3)--文件管理(查看文件大小权限信息、修改文件所属用户和操作权限、压缩解压文件)
    Linux常用命令(2)--vi (vim)文本编辑工具
    Linux常用命令(1)--用户管理(添加用户、修改密码、授予root权限)
    30分钟掌握ES6/ES2015核心内容(下)
    30分钟掌握ES6/ES2015核心内容(上)
    99%的人都理解错了HTTP中GET与POST的区别
    js中const,var,let区别
  • 原文地址:https://www.cnblogs.com/gaozihan/p/10759636.html
Copyright © 2011-2022 走看看