Вопрос Сохранение динамического массива [vector]

Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2018
Сообщения
540
Реакции[?]
130
Поинты[?]
2K
Все привет, делаю сохранение массива std::vector<std::string> и двух мерного std::vector<std::vector<Vector3>>.
Хочу понять как правильно его сохранять, т.к. у него размер динамический.
Сделал костыльно, но не нравится, то что в кфг хранятся 2 лишние переменные.
Пожалуйста помогите:roflanPominki:

C++:
static void from_json(const json& j, stConfig::stRecord& r)
{
    read(j, "bAutoRun", r.bAutoRun);
    read(j, "fDistBetween", r.fDistBetween);
    read(j, "iType", r.iType);
    read(j, "iItemsRecord[size]", r.iItemsRecord);

    r.sItemsRecord.resize(r.iItemsRecord); //увеличиваю размер массива std::vector<std::string>
    r.vRecord.resize(r.iItemsRecord); //увеличиваю двух мерный массив по 1 значению std::vector

    for (size_t i = 0; i < r.iItemsRecord; ++i) { //r.iItemsRecord размер массива std::vector<std::string>
        read(j, ("Route[" + std::to_string(i) + "]").c_str(), r.sItemsRecord[i]);
        read(j, ("iRecord[" + r.sItemsRecord[i] + "]").c_str(), r.iRecord[i]); //читаю 2 размер двух мерного массив std::vector<std::vector>
    }

    for (size_t i = 0; i < r.iItemsRecord; ++i) { //r.iItemsRecord размер массива std::vector<std::string>
        r.vRecord[i].resize(r.iRecord[i]); //Увеличиваю 2 мерный массив 2 значение std::vector<std::vector>
        for (size_t k = 0; k < r.iRecord[i]; ++k) { // в массиве r.iRecord[i] 2е значение для 2 мерного массива
            read(j, ("Name[" + r.sItemsRecord[i] + "] " + "Point[" + std::to_string(k) + "]").c_str(), r.vRecord[i][k]);
        }
    }
}
C++:
static void to_json(json& j, const stConfig::stRecord& o/*const stConfig::stRecord& dummy = {}*/)
{
    WRITE_D("bAutoRun", bAutoRun);
    WRITE_D("fDistBetween", fDistBetween);
    WRITE_D("iType", iType);
    WRITE_D("iItemsRecord[size]", iItemsRecord); //Сохраняю размер std::vector<std::string>

    for (size_t i = 0; i < o.sItemsRecord.size(); ++i) {
        WRITE_D(("Route[" + std::to_string(i) + "]").c_str(), sItemsRecord[i]);
        WRITE_D(("iRecord[" + o.sItemsRecord[i] + "]").c_str(), iRecord[i]); //Сохраняю размер std::vector<std::vector<>>
    }

    for (size_t i = 0; i < o.sItemsRecord.size(); ++i) {
        for (size_t k = 0; k < o.vRecord[i].size(); ++k) {
            WRITE_D(("Name[" + o.sItemsRecord[i] + "] " + "Point[" + std::to_string(k) + "]").c_str(), vRecord[i][k]); //Тут уже сам двух мерный массив Vector3 сохраняется
        }
    }
}
 
Пользователь
Статус
Оффлайн
Регистрация
13 Окт 2021
Сообщения
85
Реакции[?]
44
Поинты[?]
0
Все привет, делаю сохранение массива std::vector<std::string> и двух мерного std::vector<std::vector<Vector3>>.
Хочу понять как правильно его сохранять, т.к. у него размер динамический.
Сделал костыльно, но не нравится, то что в кфг хранятся 2 лишние переменные.
Пожалуйста помогите:roflanPominki:

C++:
static void from_json(const json& j, stConfig::stRecord& r)
{
    read(j, "bAutoRun", r.bAutoRun);
    read(j, "fDistBetween", r.fDistBetween);
    read(j, "iType", r.iType);
    read(j, "iItemsRecord[size]", r.iItemsRecord);

    r.sItemsRecord.resize(r.iItemsRecord); //увеличиваю размер массива std::vector<std::string>
    r.vRecord.resize(r.iItemsRecord); //увеличиваю двух мерный массив по 1 значению std::vector

    for (size_t i = 0; i < r.iItemsRecord; ++i) { //r.iItemsRecord размер массива std::vector<std::string>
        read(j, ("Route[" + std::to_string(i) + "]").c_str(), r.sItemsRecord[i]);
        read(j, ("iRecord[" + r.sItemsRecord[i] + "]").c_str(), r.iRecord[i]); //читаю 2 размер двух мерного массив std::vector<std::vector>
    }

    for (size_t i = 0; i < r.iItemsRecord; ++i) { //r.iItemsRecord размер массива std::vector<std::string>
        r.vRecord[i].resize(r.iRecord[i]); //Увеличиваю 2 мерный массив 2 значение std::vector<std::vector>
        for (size_t k = 0; k < r.iRecord[i]; ++k) { // в массиве r.iRecord[i] 2е значение для 2 мерного массива
            read(j, ("Name[" + r.sItemsRecord[i] + "] " + "Point[" + std::to_string(k) + "]").c_str(), r.vRecord[i][k]);
        }
    }
}
C++:
static void to_json(json& j, const stConfig::stRecord& o/*const stConfig::stRecord& dummy = {}*/)
{
    WRITE_D("bAutoRun", bAutoRun);
    WRITE_D("fDistBetween", fDistBetween);
    WRITE_D("iType", iType);
    WRITE_D("iItemsRecord[size]", iItemsRecord); //Сохраняю размер std::vector<std::string>

    for (size_t i = 0; i < o.sItemsRecord.size(); ++i) {
        WRITE_D(("Route[" + std::to_string(i) + "]").c_str(), sItemsRecord[i]);
        WRITE_D(("iRecord[" + o.sItemsRecord[i] + "]").c_str(), iRecord[i]); //Сохраняю размер std::vector<std::vector<>>
    }

    for (size_t i = 0; i < o.sItemsRecord.size(); ++i) {
        for (size_t k = 0; k < o.vRecord[i].size(); ++k) {
            WRITE_D(("Name[" + o.sItemsRecord[i] + "] " + "Point[" + std::to_string(k) + "]").c_str(), vRecord[i][k]); //Тут уже сам двух мерный массив Vector3 сохраняется
        }
    }
}
Сформулируй вопрос конкретнее
 
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2018
Сообщения
540
Реакции[?]
130
Поинты[?]
2K
Сформулируй вопрос конкретнее
Что может быть ещё конкретного? Нужно сохранять динамический массив у которого меняется размер.
Я сделал костыльно, делаю сохранение размера массива после изменения, чтобы в последствии этот размер подгрузить и залить данные. И мне интересно, можно ли этого сделать как то по другому.
 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,595
Реакции[?]
603
Поинты[?]
44K
если принципиально без записи размера массива в файл, можешь сделать свой синтаксис в джсоне, аля костыль ниже
kostyll:
{
   "arr": "array"
   {
       // данные сюда хуякс
   }
}
там и размерчик найдёшь


а вообще ещё одна переменная это явно выход получше
 
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2018
Сообщения
540
Реакции[?]
130
Поинты[?]
2K
если принципиально без записи размера массива в файл, можешь сделать свой синтаксис в джсоне, аля костыль ниже
kostyll:
{
   "arr": "array"
   {
       // данные сюда хуякс
   }
}
там и размерчик найдёшь


а вообще ещё одна переменная это явно выход получше
Понял, спасибо за ответ
 
Сверху Снизу