C++ 对于复杂的数据管理,有没有比多维度容器更好的解决方案?

C++ 对于复杂的数据管理,有没有比多维度容器更好的解决方案?,c++,json,data-structures,C++,Json,Data Structures,对于我目前正在编写的音乐软件,我需要在一个表5维容器中以不同的深度存储大量数据。当我说很多数据时,这并不意味着这些数据很重,大部分是小字符串和数字,但可能有很多。当软件需要数据时,数据必须能够快速调用,并且能够快速存储。什么是最好的解决方案 该软件的第一个版本是用Lua编写的,多亏了灵活的Lua表,我可以轻松做到这一点。在C++中,它会产生一个5维向量,看起来并不方便。我试了一种似乎不够快的方法。我还考虑了SQL解决方案,但我与sqlite3一起使用的当前SQLite实现实际上并不符合我想要的数

对于我目前正在编写的音乐软件,我需要在一个表5维容器中以不同的深度存储大量数据。当我说很多数据时,这并不意味着这些数据很重,大部分是小字符串和数字,但可能有很多。当软件需要数据时,数据必须能够快速调用,并且能够快速存储。什么是最好的解决方案

该软件的第一个版本是用Lua编写的,多亏了灵活的Lua表,我可以轻松做到这一点。在C++中,它会产生一个5维向量,看起来并不方便。我试了一种似乎不够快的方法。我还考虑了SQL解决方案,但我与sqlite3一起使用的当前SQLite实现实际上并不符合我想要的数据体系结构。此外,它还让我思考了一些关于我的策略的问题:在软件中编写实时数据是一种良好的做法吗?我是指软件在运行时使用的数据,有时必须在磁盘上操作,如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;

最后一行导致分段错误。

我可以使用两个结构我没有使用大量数据测试它,但似乎可以使用小序列。我在spread sheet manager中创建了一个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;
};

除了最后一行中的变量名之外,没有任何关于存储数据的信息,这个问题非常广泛。我觉得如果有一个包含结构和std::string的容器,而不是const char*,您会更高兴。数据的类型是什么,char?使用常量字符*不能只修改维度5的一个元素。在访问数据[c_-seq][track_-idx][lin][col]之前,您可以先调整数据大小,然后在需要时调整数据大小[c_-seq]等,但您确定要做什么吗?为什么会有这么多阴影?因此,你的问题包含了几个问题,使得整个问题过于宽泛。谢谢你们。我认识到这个问题包含多重询问。更确切地说,为什么会出现这些阴影我在屏幕上显示了几个电子表格,每个表格代表一个音乐曲目。它们都包含行和列。这是针对一个序列的,因为如果我更改序列号,它将用新序列数据刷新所有电子表格。所以,我需要4个维度。这个问题很广泛,因为我想知道在我的情况下,容器选项是否是最好的。您有多个可用序列–用户可以从中选择,甚至可能创建新序列。。。。2.每个序列可以包含任意数量的轨迹。3.如果用户选择一个序列,该序列的所有轨迹都将显示在电子表格中。每轨一张?4.现在,要存储在[lin][col]的数据是什么?每个音轨的数据在语义上是否相等,即。E总是e。G标题,作者,持续时间…?你明白了!每轨一张。另一件事:每个轨道的列数可以在序列之间变化。每个轨道的行数相同,但也可以在序列之间变化。要存储的数据始终存储为字符串,即使它们是数字,并且并不总是对应于相同的签名。它们对应于要传递给合成器的指令。事实上,对于那些知道的人来说,这是音乐跟踪器的基础,但列的大小可能会有所不同: