c ++ 11 — C ++: повысить относительный ключ ptree

В C ++ использую ptree от boostМне нужно найти относительный ключ для доступа a.b.c2.e1 от a.b, Этот ключ c2.e1, Как я могу написать функцию, которая находит этот относительный ключ?

#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

using namespace boost::property_tree;

std::string relative_key(const ptree &p1,const ptree &p2)
{
??????????????
// return "b.c2.e1";
}

int main()
{
ptree pt0;

pt0.put("a.b.c1",4);
pt0.put("a.b.c2.e1",4);
pt0.put("a.b.c4",4);
pt0.put("a.d",4);
pt0.put("k.m",4);
pt0.put("k.n",4);

ptree &pt_e1=pt0.get_child("a.b.c2.e1");
ptree &pt_b=pt0.get_child("a.b");

std::cout<<relative_key(pt_e1,pt_b)<<std::endl;

return 0;
}

1

Решение

Вам нужно написать рекурсивную функцию поиска, например:

bool find_subtree_helper(ptree const& haystack, ptree const& needle, path_type& path) {
if (std::addressof(haystack) == std::addressof(needle))
return true;

for (auto& child : haystack) {
auto next = path;
next /= child.first;

if ( std::addressof(child.second) == std::addressof(needle)
|| find_subtree_helper(child.second, needle, next))
{
path = next;
return true;
}
}

return false;
}

path_type find_subtree(ptree const& haystack, ptree const& needle) {
path_type path;

if (!find_subtree_helper(haystack, needle, path))
throw std::range_error("not subtree");

return path;
}

Используйте это как:

Жить на Колиру

path_type p = find_subtree(pt_b, pt_e1);
std::cout << p.dump() << std::endl;

Который печатает «c2.e1».

Полный листинг

Жить на Колиру

#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

using namespace boost::property_tree;

using path_type = ptree::path_type;

bool find_subtree_helper(ptree const& haystack, ptree const& needle, path_type& path) {
if (std::addressof(haystack) == std::addressof(needle))
return true;

for (auto& child : haystack) {
auto next = path;
next /= child.first;

if ( std::addressof(child.second) == std::addressof(needle)
|| find_subtree_helper(child.second, needle, next))
{
path = next;
return true;
}
}

return false;
}

path_type find_subtree(ptree const& haystack, ptree const& needle) {
path_type path;

if (!find_subtree_helper(haystack, needle, path))
throw std::range_error("not subtree");

return path;
}

int main()
{
ptree pt0;

pt0.put("a.b.c1",4);
pt0.put("a.b.c2.e1",4);
pt0.put("a.b.c4",4);
pt0.put("a.d",4);
pt0.put("k.m",4);
pt0.put("k.n",4);

ptree &pt_e1 = pt0.get_child("a.b.c2.e1");
ptree &pt_b  = pt0.get_child("a.b");

path_type p = find_subtree(pt_b, pt_e1);
std::cout << p.dump() << std::endl;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]