zoukankan      html  css  js  c++  java
  • 多维数组类

    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;        //映射数组,用于将高维坐标转化为低维坐标
    };
  • 相关阅读:
    。Java中的一些小细节
    。标识符命名规则
    。tar.gz(bz或bz2等)安装
    。U盘安装CentOS6.5
    。linux桌面与命令行
    。鸟哥私房菜
    。i节点
    UGUI- 单列列表(VerticalLayoutGroup)
    PhotonServer(3)-连接服务器-客户端
    PhotonServer(2)-配置
  • 原文地址:https://www.cnblogs.com/TQCAI/p/7606793.html
Copyright © 2011-2022 走看看