Я не могу найти эффективный способ перебрать повысить R-дерево (boost::geometry::index::rtree
). Единственный метод, который я до сих пор придумал, — это выполнить запрос, используя очень большую ограничивающую рамку, чтобы копия всех элементов возвращалась в векторе, однако это, очевидно, не является ни экономичным, ни экономичным по времени. В идеале я просто хотел бы использовать итератор в стиле STL для итерации по дереву обычным способом, но это не представляется возможным?
Если у вас есть запрос, содержащий все элементы, которые вы хотите перебрать, вам не нужно выполнять запрос, чтобы поместить все это в вектор, но вы можете использовать qbegin а также qend перебирать элементы напрямую. Необходимые границы, чтобы поймать все элементы могут быть получены из оценки.
С 1.59.0
begin()
а также end()
функции-члены определены в bgi::rtree
, возвращая const_iterator
, Таким образом, можно перебирать все элементы без описанных ниже методов. В C ++ 11:
for(auto const& v: rtree)
/* do something with v */
До 1.59.0
Как говорили другие, для перебора всех элементов, хранящихся в дереве, вы можете использовать итератор запросов. Однако нет необходимости выполнять фактический пространственный запрос (границы проходов и т. Д.). Вы можете передать фиктивный UnaryPredicate, всегда возвращающийся true
завернутый в bgi::satisfies()
, В C ++ 11:
std::for_each(rtree.qbegin(bgi::satisfies([](Value const&){ return true; })),
rtree.qend(),
[](Value const& v){
/* do something with v */
});
Не итерационные запросы также могут использоваться для этой цели, но для этого потребуется специальный выходной итератор, например boost::function_output_iterator
реализовано в Boost.Iterator библиотека (см. http://www.boost.org/doc/libs/1_57_0/libs/iterator/doc/function_output_iterator.html). В C ++ 11:
rtree.query(bgi::satisfies([](Value const&){ return true; }),
boost::make_function_output_iterator([](Value const& v){
/* do something with v */
}));
Примечания стороны:
namespace bgi = boost::geometry::index
Value
это тип объектов, хранящихся в bgi::rtree
boost::function_output_iterator
требует #include <boost/function_output_iterator.hpp>