Как должен работать equal_range?

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

int main()
{
    boost::property_tree::ptree ptree;
    const std::string entry = "server.url";
    ptree.add( entry, "foo.com" );

    auto range = ptree.equal_range( entry );
    for( auto iter = range.first ; iter != range.second ; ++iter )
        std::cout << iter->first << '\n';
}

Я не понимаю, почему этот код не печатается. Поскольку записей server.url может быть много, я пытался получить к ним доступ, используя equal_range,

1 ответ

Решение

equal_range не работает с путями. После добавления ваше дерево выглядит так:

<root>
  "server"
    "url": "foo.com"

Но equal_range ищет детей с именем "server.url" непосредственно в корневом узле.

Кроме того, вы, вероятно, хотите распечатать it->second.data()потому что первый просто напечатает "server.url" для каждой найденной записи.

Вот исправленный код:

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

int main()
{
    boost::property_tree::ptree ptree;
    const std::string entry = "server.url";
    ptree.add( entry, "foo.com" );

    auto range = ptree.get_child("server").equal_range( "url" );
    for( auto iter = range.first ; iter != range.second ; ++iter )
        std::cout << iter->second.data() << '\n';
}
Другие вопросы по тегам