如何在 C++ 中展平字典
Posted
技术标签:
【中文标题】如何在 C++ 中展平字典【英文标题】:How do I flatten a dictionary in 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使用增强属性树。 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);
【讨论】:
以上是关于如何在 C++ 中展平字典的主要内容,如果未能解决你的问题,请参考以下文章