Есть ли лучшее решение, чем контейнеры со многими измерениями для комплексного управления данными? - PullRequest
0 голосов
/ 16 июня 2019

Для музыкального программного обеспечения, которое я сейчас пишу, мне нужно хранить много данных разной глубины в таблице (5-мерный контейнер).Когда я говорю много данных, это не значит, что они тяжелые (это в основном небольшие строки и числа), но их может быть много.Данные должны быстро вызываться, когда это необходимо программному обеспечению, а также быстро сохранять данные.Каково было бы лучшее решение для этого?

Первая версия программного обеспечения была написана на Lua, и я мог легко это сделать (благодаря гибким таблицам Lua).В C++ это приведет к 5-мерному вектору, которым не очень удобно управлять.Я попробовал JSON-парсер , который не казался достаточно быстрым.Я также думал о решении 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 голосов
/ 16 июня 2019

Я мог бы заставить его работать с двумя структурами (я не тестировал его с большим количеством данных, но, кажется, он отлично работает с небольшими последовательностями).Я создал экземпляр 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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...