有没有比具有多个维度的容器更好的解决方案来进行复杂的数据管理?

时间:2019-06-16 14:37:58

标签: c++ json data-structures

对于我当前正在编写的音乐软件,我需要将许多深度不同的数据存储到表(5维容器)中。当我说很多数据时,并不意味着它们很繁琐(主要是小的字符串和数字),但是可以有很多。数据必须在软件需要时快速调用,也必须快速存储。最好的解决方案是什么?

该软件的第一个版本是用Lua编写的,由于灵活的Lua表,我可以轻松做到这一点。在C++中,这将导致5维向量,这似乎不太方便管理。我尝试了一个JSON parser,但速度似乎不够快。我也考虑过SQL解决方案,但是我使用的当前SQLite实现(与sqlite3配合使用)实际上并不符合我想要的数据体系结构。另外,这使我想到了有关策略的一些问题:在磁盘上写入“实时”数据(我的意思是软件在运行时使用并且有时必须进行操作的数据)(例如SQLite解决方案)在软件中是一种好习惯吗?或JSON)?我想只要内存不太多,就不需要这个了吗?另一个问题是:如果这是一种在磁盘上写入的解决方案,那么它需要多少性能?

我的最后一次尝试是写一个多维矢量,但是我不确定如何初始化它。每个嵌套向量都必须能够调整大小,而且我需要随时将一些数据放置在任何深度。

std::vector < std::vector < std::vector < std::vector < const char *> > > > data; 

//The following line obviously doesn't really work, since no vector initialization was done. But a solution working almost like this would be perfect : 
data[c_seq][track_idx][lin][col]=value;

最后一行导致分段错误。

1 个答案:

答案 0 :(得分:0)

我可以使它与两种结构一起工作(我没有用大量数据对其进行测试,但似乎可以在很小的序列下正常工作)。我在电子表格管理器中创建了一个ScoreData实例,就在这里。 感谢您的回答!

struct TrackData {
    TrackData(int lin=8,int col=8) {
        resize(lin,col);
    }

    void setValueAt(int l, int c,std::string val) {
        if(c<=colnbr && l<=lignbr) {
            data[l][c]=val;
        }
    }

    std::string getValueAt(int l,int c) {
        if(c<=colnbr && l<=lignbr) {
            if(data[l][c].size()==0) return "NULL";
            return data[l][c];
        }
    }

    void resize(int lin, int col) {
        if(lin<=0 || col<=0) return;
        if(lin!=lignbr) {
            lignbr=lin;
            data.resize(lin);
        }
        if(colnbr!=col) {
            colnbr=col;
            for(int i=0;i<data.size();i++) data[i].resize(col);
        }
    }
    void setNumcol(int col) {resize(lignbr,col);}
    void setNumlin(int lin) {resize(lin,colnbr);}

    std::vector < std::vector < std::string> > data;
    int colnbr;
    int lignbr;
};

struct ScoreData {
    ScoreData(int seq, int track) {
        resize(seq,track);
    }

    void resize(int seq,int track) {
        if(seq<=0 || track <=0) return;
        if(seq!=seqnbr) {
            seqnbr=seq;
            data.resize(seqnbr);
        }
            tracknbr=track;
            for(int i=0;i<data.size();i++) data[i].resize(track);
    }

    void setValueAt(int seq,int track,int lin,int col,std::string val) {
        if(seq>=0 && seq<seqnbr && track >=0 && track <tracknbr) {
            data[seq][track].setValueAt(lin,col,val);
        }
    }

    std::string getValueAt(int seq,int track,int lin, int col) {
        if(seq>=0 && seq<seqnbr && track >=0 && track <tracknbr) {
            return data[seq][track].getValueAt(lin,col);
        }
    }

    void setNumlin(int seq,int lin) {
        for(int i=0;i<data[seq].size();i++) data[seq][i].setNumlin(lin);
    }

    void setNumcol(int seq,int track,int col) {data[seq][track].setNumcol(col);}
    void setNumtrack(int track) {resize(seqnbr,track);}
    void setNumseq(int seq) {
        resize(seq,tracknbr);
    }

    std::vector < std::vector < TrackData > > data;
    int seqnbr;
    int tracknbr;
};