Игры здесь
Суббота, 21.12.2024, 21:52



Приветствую Вас Гость | RSS
[ Главная ] [ Boost::property_tree::ptree Получение поддерева узла - Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Boost::property_tree::ptree Получение поддерева узла
DoubleVenomДата: Понедельник, 21.02.2011, 15:32 | Сообщение # 1
Рядовой
Группа: Администраторы
Сообщений: 12
Репутация: 0
Статус: Offline
Поддерево дерева ptree получить через методы класса ptree невозможно. Хотя ptree::get_child(...) и возвращает ptree, но это - контейнер, в котором находятся дети. (т.е. без "верхушки")

iterator->second связан с ptree:

ptree::iterator iter = m_ptree.begin(); //корень дерева
const ptree *node=&iter->second; //узлы под корнем
ptree::const_iterator it2 = node->begin(); //первый из узлов

(Const использовать необязательно.)
erase(...), find(...) и итераторы работают на текущем уровне дерева.

Пример:

//создание и инициализация дерева
ptree1.put("0","0");
ptree1.put("0.1","0");
ptree1.put("0.2","0");
ptree1.put("0.1.3","0");
ptree1.put("0.1.4","0");
ptree1.put("0.2.5","0");
ptree1.put("0.2.6","0");

/* дерево примет вид:
ptree1:
>> [0] child of []
>-> [1] child of [0]
>--> [3] child of [0.1]
>--> [4] child of [0.1]
>-> [2] child of [0]
>--> [5] child of [0.2]
>--> [6] child of [0.2] */

если вызвать ptree1.erase("0") //удалит детей 0: 1 и 2.
ptree1.find("0") //найдет узел 0
ptree1.find("0.1") // вернет ptree1.not_found()

ptree::iterator iter = ptree1.begin(); //корень дерева
const ptree *node=&iter->second; //узлы под корнем
node->find("1") //найдет 0.1

for(ptree::iterator it = ptree1.begin();it!=ptree1.end();it++) {
cout << it->first << endl; //выведет 0
}

Спускаться по дереву можно только через iterator->second, причем мы будем получать контейнеры типа ptree&, содержащие узлы - детей того узла, на который указывает iterator. get_child аналогичен, но короче в записи. И путь к ребенку должен быть уникален, др. словами у родителя не должно быть детей с одинаковыми именами или будет возвращаться только один из них.

const ptree *childs = &m_ptree.get_child(sparent); //ДЕТИ sparent'а в m_ptree (путь sparen должен быть уникален, если нет - получим первый элемент по зад. пути)

Пример получения итератора заданного узла с длинным(уникальным) путем к нему:

string sparent = "tree.node_name_forming.attributes";

const ptree *childs = &m_ptree.get_child(sparent);
ptree::const_iterator itChild = childs->to_iterator(childs->find("el0"));
cout<<"Founded child: ";
cout<<Sub::log(itChild->first); //выводит el0

такой способ записывается короче, чем обход дерева от верхушки до заданного итератора, поэлементным спуском вниз.

 
  • Страница 1 из 1
  • 1
Поиск:

Михаил, 2024      Создать бесплатный сайт с uCoz