对于我当前正在编写的音乐软件,我需要将许多深度不同的数据存储到表(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;
最后一行导致分段错误。
答案 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;
};