我似乎无法找到迭代boost R-tree (boost::geometry::index::rtree
)的有效方法。到目前为止,我提出的唯一方法是使用非常大的边界框执行查询,以便在向量中返回所有元素的副本,但这显然既不节省空间也不节省时间。理想情况下,我只想使用STL样式的迭代器以通常的方式迭代树,但这似乎不可能?
答案 0 :(得分:9)
自1.59.0以来
begin()
和end()
成员函数在bgi::rtree
中定义,返回const_iterator
。因此,可以在没有下述技术的情况下迭代所有元素。在C ++ 11中:
for(auto const& v: rtree)
/* do something with v */
1.59.0之前
正如其他人所说,要遍历存储在rtree中的所有元素,您可以使用查询迭代器。但是,不需要执行实际的空间查询(传递边界等)。你可以传递一个虚拟的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.Iterator库中已实施boost::function_output_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>
答案 1 :(得分:1)