Поддерево дерева 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
такой способ записывается короче, чем обход дерева от верхушки до заданного итератора, поэлементным спуском вниз.