在字符串数组中动态创建和存储数据

时间:2018-08-22 20:05:18

标签: c++ arrays string libconfig

我正在使用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 个答案:

答案 0 :(得分:0)

我相信您的代码只需很小的改动就可以按照您需要的方式运行。您只需要一个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;
}