数组
来源:互联网 发布:淘宝收二手手机 编辑:程序博客网 时间: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
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 数组
- 谈谈Objective-C的警告
- 谈谈DOMContentLoaded:Javascript中的domReady引入机制
- MFC 小知识总结三
- HDU5100Chessboard(数论)
- Qt资源
- 数组
- SQL两表之间:根据一个表的字段更新另一个表的字段
- android数据库操作全揭秘 ---- 翻译google官方资料
- ecshop 添加自定义动态库项目详解
- Bluedroid 协议栈a2dp音频有波动的处理方法
- TFS强制解除被独占签出的文件
- Javascript函数及作用域说明
- [文件系统]——系统IO
- aop详解(二)