我一直在搜索论坛和谷歌,但很难理解我如何才能做我想做的事。
我的示例基于您在选举中看到的典型数据集。我想拆分一个分隔字符串并创建一个映射以供以后访问 该字符串如下所示: "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/