c++ - std::map 具有不同数据类型的值

标签 c++ dictionary stdmap

我一直在搜索论坛和谷歌,但很难理解我如何才能做我想做的事。

我的示例基于您在选举中看到的典型数据集。我想拆分一个分隔字符串并创建一个映射以供以后访问 该字符串如下所示: "name=candidate1;vote=1000;percent=10.5"

我可以按如下方式创建我的字符串映射

    while (getline(oss, key, '=') && getline(oss, value))
    {

      mCanData.insert(std::pair<std::string, std::string>(key, value));

    }

我想做的,但我不知道这是否可行,是在 map 中插入具有不同数据类型的值(即 key = "name"value ="candidate1", key = "vote"value =1000,键=“百分比”值=10.5)。我要创建的 map 将设置一个私有(private)类变量,稍后其他类可以通过 getter 访问该变量。我无法使用 boost 库,所以请不要建议。

任何帮助都会很棒,因为我现在迷路了。如果有更好的方法来解决这个问题,我也想知道。

最佳答案

如果你真的想把非结构化数据放在你的 map 中,在 C++17 中你可以使用 std::variant 来做到这一点,然后访问它以取回您的数据。
它遵循一个最小的工作示例:

#include <variant>
#include <string>
#include <map>
#include <iostream>

int main() {
    std::map<std::string, std::variant<std::string, int, double>> mm;
    mm["name"] = "candidate1";
    mm["vote"] = 1000;
    mm["percent"] = 10.5;

    auto visitor = [](auto data){ std::cout << data << std::endl; };
    std::visit(visitor, mm["name"]);
    std::visit(visitor, mm["vote"]);
    std::visit(visitor, mm["percent"]);
}

wandbox 上查看它的启动和运行情况.
它是否适合你主要取决于你是否可以使用 C++17。你没有指定它,所以很难说。


话虽这么说,结构化数据 ( as suggested by @rici ) 看起来是解决问题的好方法。
然而,我们既不能说真正的问题是什么,也不能说您是如何设计其余代码的,因此值得一提的可能还有 std::variant

关于c++ - std::map 具有不同数据类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47404870/

相关文章:

C++:同一对象的基类与派生类的指针比较

c++ - openMp:并行化 std::map 迭代

c++ - 如何正确调用 UrlCanonicalize API 函数?

c++ - 使用 vector 进行二进制搜索

android - Android map 上图标上的暗光

python - 如何访问数据框中包含字典字符串数据的列的内容

C++:如果使用自定义类(而不是指针),则 std::map 和 std::set 不会排序

c++ - 如何访问结构中定义的变量

c++ - 将并行程序从 openMP 转换为 openCL

c# - 为什么 C# 中的字典有一个 .Distinct() 扩展名?