文件操作与模板编程题 #1(C++程序设计第7周)

来源:互联网 发布:地图 数据可视化工具 编辑:程序博客网 时间:2024/06/01 18:01

问题描述

实现一个三维数组模版CArray3D,可以用来生成元素为任意类型变量的三维数组,使得下面程序输出结果是:

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,

注意,只能写一个类模版,不能写多个。

#include <iostream>using namespace std;// 在此处补充你的代码int main(){    CArray3D<int> a(3,4,5);    int No = 0;    for( int i = 0; i < 3; ++ i )        for( int j = 0; j < 4; ++j )            for( int k = 0; k < 5; ++k )                a[i][j][k] = No ++;    for( int i = 0; i < 3; ++ i )        for( int j = 0; j < 4; ++j )            for( int k = 0; k < 5; ++k )                cout << a[i][j][k] << ",";return 0;}

输入

输出

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,

样例输入

样例输出

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,

提示

提示:类里面可以定义类,类模版里面也可以定义类模版。例如:

class A{    class B {    };};templateclass S{    T x;    class K {        T a;    };};

PS:这道题还是废了点时间的,尤其算法1中刚开始写的为屏蔽部分的代码,编译成功,运行会出错,至今仍不清楚错误在哪(可能需要重载赋值运算符,默认的又有什么作用?)。**算法2是网上看到的,写的很好,摘抄如下。

源码
算法1

#include <iostream>using namespace std;// 在此处补充你的代码template <class T>class CArray3D{public:    template <class T1>    class CArray2D    {    private:         T1 *a1;//指向二维数组的指针        int row;//数组行数        int column;//数组列数    public:        CArray2D():a1(NULL),row(0),column(0) {}        CArray2D(int paraRow, int paraColumn):row(paraRow),column(paraColumn) { a1 = new T1[row*column];}        void set(int paraRow, int paraColumn)        {            row = paraRow;            column = paraColumn;            a1 = new T1[row*column];        }        ~CArray2D(){if(a1) delete[] a1;}        T1* operator[](int i) {return a1+i*column;}//重载的实际上是第二维的[], 第一维的[]直接调用int型一维数组的定义    };private:    CArray2D<T> *ptr;public:    CArray3D():ptr(NULL) {}    CArray3D(int z, int y, int x)    {        ptr = new CArray2D<T>[z];        for (int m = 0; m < z; m++)        {            ptr[m].set(y,x);//          CArray2D<T> a(y, x);//          ptr[m] = a;        }    }    CArray2D<T>& operator[](int i){return ptr[i];}    ~CArray3D(){if (ptr){delete[] ptr;}}};int main(){    CArray3D<int> a(3,4,5);    int No = 0;    for( int i = 0; i < 3; ++ i )        for( int j = 0; j < 4; ++j )            for( int k = 0; k < 5; ++k )                a[i][j][k] = No ++;    for( int i = 0; i < 3; ++ i )        for( int j = 0; j < 4; ++j )            for( int k = 0; k < 5; ++k )                cout << a[i][j][k] << ",";    return 0;}

算法2

#include <iostream>using namespace std;template <class T>class CArray3D{public:    template <class T1>    class CArray2D    {      public:        template <class T2>        class CArray1D        {          public:            CArray1D()            {                a = NULL;            }            void set(int n)            {                if(a) delete[]a;                a = new T[n];            }            T2 &operator[](int i)            {                return a[i];            }            ~CArray1D(){delete []a;}        private:            T2 * a;        };        CArray2D()        {            a1 = NULL;        }        void set(int m, int n)        {            a1 = new CArray1D<T1> [m];            for(int i = 0; i < m; i ++)                a1[i].set(n);        }        ~CArray2D()        {delete [] a1;}        CArray1D<T1> & operator[](int i)        {            return a1[i];        }    private:        CArray1D <T1> * a1;     };    CArray3D(int p, int m, int n)    {        a2 = new CArray2D<T> [p];        for(int i = 0; i < p; i ++)            a2[i].set(m,n);    }    ~CArray3D(){delete[] a2;}    CArray2D<T>& operator[](int i)    {        return a2[i];    }private:    CArray2D<T> *a2;};int main(){    CArray3D<int> a(3,4,5);    int No = 0;    for( int i = 0;i < 3; ++ i )        for(int j = 0; j < 4; ++j )            for(int k = 0; k < 5; ++k )                a[i][j][k]= No ++;    for( int i = 0;i < 3; ++ i )        for(int j = 0; j < 4; ++j )            for(int k = 0; k < 5; ++k )                cout<< a[i][j][k] << ",";    return 0;}
0 0
原创粉丝点击