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
}