【问题标题】:How do I flatten a dictionary in c++如何在 C++ 中展平字典
【发布时间】:2018-10-26 00:38:25
【问题描述】:

我怎样才能展平下面的字典-

输入:

dict = {
            "Key1" : "1",
            "Key2" : {
                "a" : "2",
                "b" : "3",
                "c" : {
                    "d" : "3",
                    "e" : {
                        "" : "1"
                    }
                }
            }
        }

输出:

{
            "Key1" : "1",
            "Key2.a" : "2",
            "Key2.b" : "3",
            "Key2.c.d" : "3",
            "Key2.c.e" : "1"
        }

输入映射的数据类型是map<string, void*> 预期的输出映射为map<string,string>

【问题讨论】:

  • 首先不要使用void*。您无法使用这些指针指向的对象。
  • 输入是分层的,输入map的类型怎么可能是map<string, void*>呢?请发布一些 C++ 代码。
  • @HajoKirchhoff map 类模板不是分层的。如果她想分层定义输入,则需要“下一个指针”。这可以指向"Key1" 处的数据或"Key2" 处的下一个节点。不过,C++ 中有更好的方法来实现这一点。
  • @harper:这正是我的观点。地图不是分层的。那么输入映射的数据类型怎么可能是 map
  • 拥有 void* 的目的是它可以是字符串或另一个映射。这就是可以创建层次结构的方式。我相信我们可以使用 typeid 运算符来获取类型。如果它是一个字符串,那么我们只需打印它,如果它是一个映射,则使用 static_cast 将 void* 强制转换为该映射,然后递归调用相同的函数。这个问题实际上是在一个黑客队伍中被问到接受采访的。无法更改函数声明。

标签: c++ dictionary stdmap flatten


【解决方案1】:

使用增强属性树。 PropertyTree 能够表示层次结构,甚至带有一个小的 json 解析器。它还具有符合标准的迭代器,因此您可以遍历树并将每个节点复制到输出映射中,从而有效地展平树。

类似这样的东西(取自https://www.boost.org/doc/libs/1_65_1/doc/html/property_tree/tutorial.html):

namespace pt = boost::property_tree;
ptree tree;

// read the hierarchical data into the tree
pt::read_json(filename, tree);

map<string, string> out;
flatten(tree, out);

flatten 递归遍历树:

void flatten(const pt::tree &tree, map<string, string> &out)
{
   for (const auto &j:tree)
   {
      copy_to_out(j, out);
      if (is_tree(j))
         flatten(j, out);
   }
}

【讨论】:

    猜你喜欢
    • 2016-09-03
    • 1970-01-01
    • 2023-03-26
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2015-09-05
    相关资源
    最近更新 更多