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;
}