【问题标题】:map inside map in C++在 C++ 中映射内部映射
【发布时间】:2021-06-02 08:35:42
【问题描述】:

我很难在 C++ 中创建嵌套地图。

首先我已经定义了我的类型

typedef std::map<std::variant<int, std::string>, std::variant<int, long long int, std::string>> SimpleDict;
typedef std::map<std::variant<int, std::string>, std::variant<int, std::string,std::vector<SimpleDict>,SimpleDict>> ComplexDict;

然后我定义我的地图:

ComplexDict m = {
        "MAC0", {

                {"TAG0", "111001011000"},
                {"SEQ", "110000100100"},
                {"IOD", "0000"}

        }

};

但是我得到No matching constructor for initialization of 'ComplexDic。即使为了简单起见,我将 m 的类型更改为 std::map&lt; std::string, std::map&lt;std::string, std::string&gt; &gt;,我也会得到相同的错误。我想我在语法上做错了。你能帮忙吗?

【问题讨论】:

  • "MAC0", 是什么?也许您只是缺少一组大括号。在您的示例中,应该使用单个元素初始化地图?
  • 您缺少一对括号:godbolt.org/z/7nGaWPxWz(代表外部地图的单个元素)。
  • 旁注:如果您尝试使用自己的 JSON 解析器,我建议使用现有库之一。这是一项相当艰巨的任务。
  • 解释:std::map内部以std::pair&lt;key_type, value_type&gt;s的形式存储其内容。如果你想初始化一个地图,你也需要提供这样的对:ComplexDict m = { std::pair&lt;key_type, value_type&gt;("MAC0", { /* your map */ }) }; 这个对不需要明确指定,你可以再次从统一初始化中受益——这是通过 additional pair 大括号,如前面的 cmets 所示。
  • 无关,std::variant 不符合 C++11 甚至 C++14 的标准。它是在 C++17 中引入的,所以这篇文章的标签是有问题的。

标签: c++ dictionary c++11 stdmap


【解决方案1】:

在这两种情况下,您都错过了一组大括号来表示“顶级映射中的一对”:

typedef std::map< std::string, std::map<std::string, std::string> > ComplexDict2;
ComplexDict2 m = {
    { //first pair of map
        "MAC0", {
            {"TAG0", "111001011000"},
            {"SEQ", "110000100100"},
            {"IOD", "0000"}
        }
    } //first pair end
};

对于带有变体的实际情况,编译器似乎很困惑这应该是什么类型:

{
    {"TAG0", "111001011000"},
    {"SEQ", "110000100100"},
    {"IOD", "0000"}
}

您可以通过显式命名类型来解决它:

ComplexDict m = {
    {
        "MAC0", SimpleDict {
            {"TAG0", "111001011000"},
            {"SEQ", "110000100100"},
            {"IOD", "0000"}
        }
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2015-08-09
    • 2012-07-23
    • 2022-10-02
    相关资源
    最近更新 更多