Как перебрать R-дерево наддува?

Я не могу найти эффективный способ перебрать повысить R-дерево (boost::geometry::index::rtree). Единственный метод, который я до сих пор придумал, — это выполнить запрос, используя очень большую ограничивающую рамку, чтобы копия всех элементов возвращалась в векторе, однако это, очевидно, не является ни экономичным, ни экономичным по времени. В идеале я просто хотел бы использовать итератор в стиле STL для итерации по дереву обычным способом, но это не представляется возможным?

2

Решение

Если у вас есть запрос, содержащий все элементы, которые вы хотите перебрать, вам не нужно выполнять запрос, чтобы поместить все это в вектор, но вы можете использовать qbegin а также qend перебирать элементы напрямую. Необходимые границы, чтобы поймать все элементы могут быть получены из оценки.

1

Другие решения

С 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 */
}));

Примечания стороны:

  • Приведенный выше код требует Boost.Geometry заголовки библиотеки, упомянутые в документации
  • namespace bgi = boost::geometry::index
  • Value это тип объектов, хранящихся в bgi::rtree
  • boost::function_output_iterator требует #include <boost/function_output_iterator.hpp>
  • в C ++ 14 можно использовать общие лямбда-выражения, тогда приведенный выше код будет независимым от типа значения
9

По вопросам рекламы [email protected]