C++ 一些初级代码(1.1) 自己创建的一个不太正常的三维数组类

c++ 一些初级代码(1.1)

emm 从前写的一些小程序,粘贴在这里用于记录吧。
以后复习就看这个吧。

自己创建的一个不太正常的三维数组类

这道题上网上查才清楚怎么做,不能局限于先构造二维然后再创建三维array的想法,而是用二维来通过访问地址间接访问内存。

数组创建的思想就是分配一段连续的内存,然后通过地址访问(连续的内存)所以对于一维数组我们要通过其首地址来访问。
比如:

template<class T>
class MyArray
{
	//一维数组类
	T *arr;
	int size;
public:
	MyArray(int len):size(len){
	arr = new T [size];
	}
	MyArray(const MyArray & A){
	size = A.size;
	arr = new T [size];// 注: 如果这里不写的话,在复制的时候默认赋值会将A的指针直接给MyArray,那么在析构的时候有可能发生重复,运行出错。
	
		for(int i=0;i<size;i++){
			arr[i]=A.arr[i];
		}
	}
	~MyArray(){
	delete [] arr;//由于分配的内存不止一个位置,删除对应delete[]
	}
	T & operator[](int i){
		if(i>=0&&i<size)
			return *(arr+i);
	}
};
	
	

接下来要进行三维数组的创建(二维数组类似一维):

#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
template <class T>
class CArray3D
{
    //这里要创建一个二维数组模板类,但是并不能作为单独的二维数组,只是储存了对应的地址和行列数,用来做访问地址的工具
class CArray2D
{
private:
    int Row, Col;//行数和列数
    T *p;//这一个二维数组所对应的首地址,不需要给他分配内存,只需要当做地址访问的中间媒介就行
public:
    CArray2D(T *pin,int a, int b):Row(a),Col(b),p(pin)
    {

    }
    CArray2D(){}
    operator T* ()//类型强制转换函数
    {
        return p;
    }
    T* operator[](int i)//调用【】运算符重载,跟上面的不一样不要弄混
    {
        return p+i*Col;
    }
};

private:
    int layer,colomn,row;//行列层
    T * arr;//仍然像创建二维数组那样用一个指针来访问,通过地址的加减
    CArray2D *p;
public:
    CArray3D(int a, int b, int c):layer(a),row(b),colomn(c)
    {
        arr=new T[layer*row*colomn];
        p= new CArray2D[layer];
        for(int i=0;i<layer;i++)
        {
            p[i]=CArray2D(arr+i*colomn*row,row,colomn);
        }
    }
    ~CArray3D()
    {
        delete [] p;
        delete[] arr;
    }
    CArray2D& operator [](int i)
    {
        return p[i];
    }

};



CArray3D<int> a(3,4,5);
CArray3D<double> b(3,2,2);
void PrintA()
{
	for(int i = 0;i < 3; ++i) {
		cout << "layer " << i << ":" << endl;
		for(int j = 0; j < 4; ++j) {
			for(int k = 0; k < 5; ++k)
				cout << a[i][j][k] << "," ;
			cout << endl;
		}
	}
}
void PrintB()
{
	for(int i = 0;i < 3; ++i) {
		cout << "layer " << i << ":" << endl;
		for(int j = 0; j < 2; ++j) {
			for(int k = 0; k < 2; ++k)
				cout << b[i][j][k] << "," ;
			cout << endl;
		}
	}
}

int main()
{

	int No = 0;
	for( int i = 0; i < 3; ++ i ) {
		a[i];
		for( int j = 0; j < 4; ++j ) {
			a[j][i];
			for( int k = 0; k < 5; ++k )
				a[i][j][k] = No ++;
			a[j][i][i];
		}
	}
	PrintA();
	memset(a[1],-1 ,20*sizeof(int));//memset作用的对象是一个一维的数组对象,所以这里如果是二维指针就不行,正常的三维指针也不行
	memset(a[1],-1 ,20*sizeof(int));
	PrintA();
	memset(a[1][1],0 ,5*sizeof(int));
	PrintA();

	for( int i = 0; i < 3; ++ i )
		for( int j = 0; j < 2; ++j )
			for( int k = 0; k < 2; ++k )
				b[i][j][k] = 10.0/(i+j+k+1);
	PrintB();
	int n = a[0][1][2];
	double f = b[0][1][1];
	cout << "****" << endl;
	cout << n << "," << f << endl;

	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值