C++ 如何用c++;

C++ 如何用c++;,c++,dictionary,stdmap,flatten,C++,Dictionary,Stdmap,Flatten,我怎样才能把下面的字典弄平- 输入: dict = { "Key1" : "1", "Key2" : { "a" : "2", "b" : "3", "c" : { "d" : "3", "e" : { "" : "1"

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

输入:

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

预期的输出映射是
map

使用boost PropertyTree。PropertyTree能够表示层次结构,甚至还附带了一个小型json解析器。它还具有符合std的迭代器,因此您可以在树上进行迭代,并将每个节点复制到输出映射中,从而有效地展平树

类似这样的内容(摘自):


首先不要使用
void*
。您无法使用这些指针指向的对象。当输入是分层的时,输入映射的类型如何才能是
map
?请发布一些C++代码。@ HajoKirchhoff <代码> map < /Cord>类模板不是分级的。如果她想按层次定义输入,则需要“下一个指针”。可以指向数据,如在
“Key1”
处或在
“Key2”
处指向下一个节点。在C++中有更好的方法来实现这一点。@哈伯:这正是我的观点。地图不是分层的。那么,输入映射的数据类型怎么可能是映射呢?使用void*的目的是它可以是字符串,也可以是另一个映射。这就是如何创建层次结构。我相信我们可以使用typeid操作符来获取类型。如果它是一个字符串,那么我们只打印它,如果它是一个映射,那么使用static_cast将void*转换为该映射,然后递归调用相同的函数。这个问题实际上是在一个黑客级别的面试中被问到的。无法更改函数声明。
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);
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);
   }
}