多维数组类

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('\n',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;        //映射数组,用于将高维坐标转化为低维坐标
};

 

posted @ 2017-09-28 15:10  TQCAI  阅读(178)  评论(0编辑  收藏  举报