matriz bidimensionales arreglos c++ boost subtree boost-propertytree boost-foreach

c++ - matriz - arreglos bidimensionales en ruby



Boost 1.46.1, Árbol de propiedades: ¿Cómo iterar a través de subárboles de recepción de phare? (3)

Los iteradores del árbol de propiedades apuntan a los pares de la forma (key, tree) de tipo ptree::value_type . El bucle estándar para iterar a través de los elementos secundarios del nodo en el path ve así:

BOOST_FOREACH(const ptree::value_type &v, pt.get_child(path)) { // v.first is the name of the child. // v.second is the child tree. }

En primer lugar, diré que creo que tengo cómo hacerlo, pero mi código no se compilará de ninguna manera. Basé mi suposición en este ejemplo oficial de truco de ptree vacío . Ahí puedes encontrar la siguiente línea:

const ptree &settings = pt.get_child("settings", empty_ptree<ptree>());

Lo que muestra que es (o debería ser) posible obtener subtarea de ptree.

Así que asumí que podríamos iterar a través de ptree con algo como BOOST_FOREACH de tal manera:

BOOST_FOREACH(const boost::property_tree::ptree &v, config.get_child("servecies")) { }

Pero me sale el siguiente error:

Error 1 error C2440: ''inicialización'': no ​​se puede convertir de ''std :: pair <_Ty1, _Ty2>'' a ''const boost :: property_tree :: ptree &''

o si intento

BOOST_FOREACH(boost::property_tree::ptree &v, config.get_child("servecies", boost::property_tree::empty_ptree<boost::property_tree::ptree>())) { }

Yo obtengo:

Error 1 error C2039: ''empty_ptree'': no ​​es miembro de ''boost :: property_tree''

Entonces, ¿qué debo hacer: cómo iterar a través de Boost Ptree y obtener sub Ptrees?

Actualización: también probé dicho código

BOOST_FOREACH(boost::property_tree::ptree::value_type &v, config.get_child("path.to.array_of_objects")) { std::cout << "First data: " << v.first.data() << std::endl; boost::property_tree::ptree subtree = (boost::property_tree::ptree) v.second ; BOOST_FOREACH(boost::property_tree::ptree::value_type &vs, subtree) { std::cout << "Sub data: " << vs.first.data() << std::endl; } }

Esta compila, no emite ninguna excepción, pero no incluye ningún Sub data , simplemente mantiene a través de este ciclo.

Actualización 2:

Hm ... algo probablemente salió mal en mi xml - ahora obtengo los resultados correctos con ese código.


Tuve el mismo problema al iterar a través de subnodos JSON

boost::property_tree::read_json(streamJSON, ptJSON);

Si tienes una estructura como:

{ playlists: [ { id: "1", x: "something" shows: [ { val: "test" }, { val: "test1" }, { val: "test2" } ] }, { id: "2" x: "else", shows: [ { val: "test3" } ] } ] }

Puede iterar nodos secundarios de canal como este:

BOOST_FOREACH(boost::property_tree::ptree::value_type &playlist, ptJSON.get_child("playlists")) { unsigned long uiPlaylistId = playlist.second.get<unsigned long>("id"); BOOST_FOREACH(boost::property_tree::ptree::value_type &show, playlist.second.get_child("shows.")) { std::string strVal = show.second.get<std::string>("val"); } }

No pude encontrar nada sobre el selector de ruta "shows". para seleccionar la matriz secundaria. (fíjate en el punto al final)

Algunos buenos documentos se pueden encontrar aquí: http://kaalus.atspace.com/ptree/doc/index.html

Espero que esto ayude a alguien.


Usando C ++ 11, puede usar lo siguiente para iterar a través de todos los elementos secundarios del nodo en la path :

ptree children = pt.get_child(path); for (const auto& kv : children) { // kv is of type ptree::value_type // v.first is the name of the child // v.second is the child tree }