数组

来源:互联网 发布:淘宝收二手手机 编辑:程序博客网 时间:2024/05/21 10:14

自定义数组,用一维数组来模拟实际的多维数组。ADT仍采用严书

/*  Author : Moyiii *  Mail:  lc09@vip.qq.com *  (多维)数组的实现 *  仅作学习之用,当然如果你想拿去用,随你好啦。 *  如果发现BUG,或你有更好的想法,欢迎反馈给我*/#include <iostream>#include <cstdarg>using namespace std;const int MAX_DIM = 4;//再多点维度真不知道怎么打印出来观测了0.0class MArray{public:    MArray(int n, ...);    bool assValue(int n,int e, ...);    int getValue(int n, ...);    int getDim();    ~MArray();private:    int *bounds;//储存边界    int dim;//维度    int *elems;//一维数组模拟多维数组};//用到了不确定个数的函数参数,具体用法请参考c语言手册//一定要有一个确定的参数。这里为维度NMArray :: MArray(int n, ...){    if(n < 1 || n > MAX_DIM)    {        cout << "Tooooooooooo Big Dim!" << endl;        return;    }    dim = n;    bounds = new int[n];    //变参    va_list args;    //获得第一个变参    va_start(args, n);    for(int i = 0; i < n; ++i)    {        //获得下一个变参        int dimi = va_arg(args, int);        if(dimi < 1)        {            cout << "Are you kidding me?" << endl;            return;        }        bounds[i] = dimi;    }    int product = 1;    for(int i = 0; i < n; ++i)    {        product *= bounds[i];    }    //所有维度的乘积就是一维数组的长度    //例如一个5*5的数组能够容纳25个元素,因此判断一维数组多长    //只要把所有维度的值相乘即可    elems = new int[product];    //释放变参,一个start 对应一个end    va_end(args);    return;}MArray :: ~MArray(){    if(!bounds)    {        delete []bounds;    }    if(!elems)    {        delete []elems;    }}//本书没有按照严蔚敏做法,首先算出每一维度下包含//多少个元素,因此求坐标时,要逆序重新计算bool MArray :: assValue(int n,int e, ...){    int *loc = new int[n];    va_list args;    va_start(args, e);    //把输入的坐标暂时保存    for(int i = 0; i < n; ++i)    {        loc[i] = va_arg(args, int);        if(loc[i] < 0 || loc[i] > bounds[i])        {            delete []loc;            cout << "Over Bound!" << endl;            return false;        }    }    //从最低维度开始存,注意,不倒着写可能也是对的    //但是跟我们人的思维方式可能会有出入,我们人的    //思维方式是行优先的,这个算法应该不难理解,看一下    //多维数组的定义和公式就能明白    int sum = loc[n-1];    int base = bounds[n-1];    for(int i = n - 2; i >= 0; --i)    {        sum += (loc[i] * base);        base *= bounds[i];    }    elems[sum] = e;    delete []loc;    va_end(args);    return true;}//和储存元素的方法一模一样int MArray :: getValue(int n, ...){    int *loc = new int[n];    va_list args;    va_start(args, n);    for(int i = 0; i < n; ++i)    {        loc[i] = va_arg(args, int);        if(loc[i] < 0 || loc[i] > bounds[i])        {            delete []loc;            cout << "Over Bound!" << endl;            return false;        }    }    int sum = loc[n-1];    int base = bounds[n-1];    for(int i = n - 2; i >= 0; --i)    {        sum += (loc[i] * base);        base *= bounds[i];    }    delete []loc;    va_end(args);    return elems[sum];}int MArray :: getDim(){    return dim;}int main(){    MArray m(2,5,10);    for(int i = 0; i < 5; ++i)    {        for(int j = 0; j < 10; ++j)        {            m.assValue(2,i*10 + j, i , j);        }    }    for(int i = 0; i < 5; ++i)    {        for(int j = 0; j < 10; ++j)        {            cout << m.getValue(2,i,j) << " ";        }        cout << endl;    }    return 0;}


0 0