c++ - 如何在 std::map 中存储混合类型项目?

标签 c++ dictionary stl stdmap

我的数据如下所示:

enter image description here

我需要在我的 C++ 应用程序中访问这些数据。我还需要能够通过变量键名称关联访问项目;例如:

std::string key = "ema50";
double value = data[key];

一个std::vector<std::map<std::string, double>>对此会很棒,但我不知道该怎么处理 groups元素。我希望能够访问testingvalidation vector 中给定项目的数组:

int testingGroups[9] = data["groups"]["testing"];
int validationGroups[9] = data["groups"]["validation"];

有什么办法可以实现这一点吗?我确实更喜欢使用 vector 和 map ,但只要我可以关联访问数据项,我也愿意接受其他解决方案。

是否使用描述的模板 here是要走的路吗?

最佳答案

您提供的链接中接受的答案,C++ std::map holding ANY type of value ,实际上是要走的路。本质上你想要一个 VARIANT 的映射 - 可以是任何值的对象,甚至是另一个映射(它使你能够拥有多个索引,只是不那么漂亮 - 例如,它会像 data[ “foo”].asMap[“bar”])。变体通常是带有提示成员的奇特 union 体,例如

struct MyVariant {
    int type; // or enum
    union {
        int asInt;
        bool asBool;
        double asDouble;
        // etc...
        std::map<std::string, MyVariant> asMap;
    }
};        

但正如所引用问题的已接受答案一样,您必须能够智能地处理与其他类型 union 的指针类型。您可以添加“flags”成员来表示内存的所有权(深复制),而不是指向不属于变体的内存的指针(浅复制)。并且 - union 类型之一可以是另一个映射,它允许您创建任意深度的结构。

关于c++ - 如何在 std::map 中存储混合类型项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36658140/

相关文章:

c++ - 将指针并集转换为 void*

c++ - 获取指向 std::list 或 std::forward_list 中节点的指针

c++ - 创建一个 alpha 蒙版(glBlendFunc 现在做什么?)

c# - 查看字典字符串值是否包含某种模式并且同时不包含 C# 中的其他模式的最佳方法是什么?

Python-将列表的列表映射到字典

Swift 4 (BETA) 合并字典无法推断参数类型

c++ - 如何使用 STL 排序函数根据第二列对二维数组进行排序?

c++ - 用于 std::set 的 std::back_inserter?

android - 我在哪里可以下载 cocos2d-x 预构建二进制文件?

c++ - 编译器如何生成模板类定义?