C++ code
#include "stdafx.h" #include <fstream> #include <assert.h> #include <string> #include "procs.h" #include "str.h" #include "LinkList.h" #pragma once using namespace std; template <class T> class CMultiArr { public: CMultiArr(char* filePath,int &div)//从文件中获取输入,并判断属于1维向量还是2维矩阵 { ifstream infile; infile.open(filePath); assert(infile.is_open()); infile.seekg(0,ios::end); int fileLen=infile.tellg(); infile.seekg(0,std::ios::beg); char* buf=new char[fileLen+1]; int i=0 , j ; while(! infile.eof()) infile.read(&buf[i++],1); buf[i-1]=0;//因为之前写的是 i ,所以出现bug CStr Srow(buf); delete buf; int row; CStr *Srows=Srow.split(' ',row);//获取行 int col; CStr *Scols=Srows[0].split(' ',col); if(row==1)//这是一个向量 { div=1; //开始构造内部数据结构 *this=CMultiArr(1,col); for(i=0;i<Size(0);i++) data[i]=Scols[i].str2int(); } else { div=2; //开始构造内部数据结构 *this=CMultiArr(2,row,col); for(i=0;i<Size(0);i++) { CStr *Scols=Srows[i].split(' ',col); for(j=0;j<Size(1);j++) Set(Scols[j].str2int(),i,j); } } infile.close(); } CMultiArr(int n, ... )//根据维数以及各维数据初始化 { nDiv=n; int *p=&n + 1; divData=new int[n]; length=1; int i; for(i=0;i<n;i++) { divData[i]=p[i]; length*=p[i]; } //if(n>1) length-=1;//此处造成了构造向量时的bug。并且体现在复制构造函数上 data=new T[length]; map=new int[n]; map[0]=1; for(i=1;i<n;i++) map[i]=divData[i-1]*map[i-1]; } CMultiArr(CMultiArr<T>& obj) { nDiv=obj.nDiv; divData=new int[nDiv]; length=obj.length; data=new T[length]; map=new int[nDiv]; int i; for(i=0;i<length;i++) data[i]=obj.data[i]; for(i=0;i<nDiv;i++) map[i]=obj.map[i]; } ~CMultiArr() {/* delete data; delete divData; delete map;*/ } int Size(int xDiv) { return divData[xDiv]; } int getPos(int *p) { int re=0; int i; for(i=0;i<nDiv;i++) re+=p[i]*map[i]; return re; } bool Set(T input,int pos, ... ) { data[getPos(&pos)]=input; return 1; } T Get(int pos, ... ) { return data[getPos(&pos)]; } protected: private: T * data;//将多维数组降维成一维数组来管理 int length; int nDiv;//维数 int * divData;//维数数据 int * map; //映射数组,用于将高维坐标转化为低维坐标 };