Динамическое создание и хранение данных в строковом массиве

Я использую библиотеку libconfig C++ для получения хранимых данных, и мне нужно хранить эти данные в строковом массиве в C++, не зная количества переменных, которые будут переданы через файл конфигурации. Я знаю, что это на самом деле невозможно в C++, но я пытаюсь найти лучшую практику для этого, и другие решения, кажется, не имеют практического смысла для того, что я делаю. Ниже приведена часть кода, где я пытаюсь взять строковый тип файла и сохранить все результаты по отдельности в строковом массиве.

    try {
    for (int i = 0; i < cfg.getRoot()["files"].getLength(); ++i) {
        // Only output the record if all of the expected fields are present.
        string filetype;
        if (!(cfg.getRoot()["files"][i].lookupValue("filetype", filetype)))
            continue;

        cout << filetype << endl;
    }
}
catch (const SettingNotFoundException &nfex) {
    // Ignore.
}

Извиняюсь за вероятный лицевой импульс, который у вас есть сейчас, я студент колледжа, все еще изучающий веревки, и в настоящее время я работаю над своим курсом над личным проектом.

1 ответ

Решение

Я считаю, что ваш код может работать так, как вам нужно, с минимальными изменениями. Все, что вам нужно, это std::vector<std::string> чтобы содержать все поля, которые вы записываете из вашего цикла:

std::vector<std::string> filetypes;

try {
    for (int i = 0; i < cfg.getRoot()["files"].getLength(); ++i) {
        // Only output the record if all of the expected fields are present.
        std::string filetype;
        if (!(cfg.getRoot()["files"][i].lookupValue("filetype", filetype)))
            continue;

        //The use of std::move is optional, it only helps improve performance.
        //Code will be logically correct if you omit it.
        filetypes.emplace_back(std::move(filetype));
    }
}
catch (const SettingNotFoundException &nfex) {
    // Ignore.
}

//Proof that all values have been properly stored.
for(std::string const& filetype : filetypes) {
    std::cout << filetype << std::endl;
}

Я не знаю, какой тип возврата на cfg.getRoot()["files"] есть, но может быть целесообразно сохранить этот объект для улучшения читабельности вашего кода:

std::vector<std::string> filetypes;

try {
    //One of these is correct for your code; I don't know which.
    //auto & files = cfg.getRoot()["files"];
    //auto const& files = cfg.getRoot()["files"];
    //I'm assuming this is correct
    auto files = cfg.getRoot()["files"];

    for (auto const& entry : files) {
        // Only output the record if all of the expected fields are present.
        std::string filetype;
        if (!(entry.lookupValue("filetype", filetype)))
            continue;

        //The use of std::move is optional, it only helps improve performance.
        //Code will be logically correct if you omit it.
        filetypes.emplace_back(std::move(filetype));
    }
}
catch (const SettingNotFoundException &nfex) {
    // Ignore.
}

//Proof that all values have been properly stored.
for(std::string const& filetype : filetypes) {
    std::cout << filetype << std::endl;
}
Другие вопросы по тегам