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

bar*_*uti 6 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));

    }
Run Code Online (Sandbox Code Playgroud)

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

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

sky*_*ack 6

如果您确实想将非结构化数据放入映射中,在 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"]);
}
Run Code Online (Sandbox Code Playgroud)

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


话虽这么说,结构化数据(如 @rici 所建议的)看起来是解决问题的更好方法。
然而,我们既不能说真正的问题是什么,也不能说你是如何设计其余代码的,所以它可能也值得一提std::variant


ric*_*ici 4

在 C++ 中std::map,所有值都具有相同的类型。

一般来说,当您拥有这样的结构化数据时,您需要定义一个结构化类型:

class Vote {
  public:
    std::string name;
    int         vote;
    double      percent;
};
Run Code Online (Sandbox Code Playgroud)