c++ - boost R 树 : counting elements satisfying a query

标签 c++ boost r-tree boost-geometry

到目前为止,当我想计算我的 R 树中有多少元素满足特定空间查询时,归结为运行查询、收集匹配项然后对它们进行计数,大致如下:

std::vector<my_type> results;
rtree_ptr->query(bgi::intersects(query_box), std::back_inserter(results));
int nbElements = results.size();

有没有更好的方法,即直接计数而不检索实际元素的方法?我还没有找到任何可以做到的,但谁知道呢。 (我正在用打包算法构建我的树,以防它有任何相关性。)

我的动机是我注意到我的查询速度取决于匹配项的数量。如果有 0 个匹配项,则查询或多或少是瞬时的;如果有 10 000 个匹配项,则需要几秒钟。由于可以非常快地确定是否存在任何匹配项,因此遍历树似乎非常快(至少在我制作的索引中);它正在收集所有结果,如果有很多匹配项,这些结果会使查询变慢。由于我对收集不感兴趣,而只是简单地计算(至少对于某些查询),如果我可以跳过收集,那就太棒了。

最佳答案

我的脑电波迟到了。比使用 function_output_iterator 更好的方法是使用 boost::geometry::index query_iterators。

原则上,它会导致完全相同的行为,代码稍微简单一些:

box query_box;
auto r = boost::make_iterator_range(bgi::qbegin(tree, bgi::intersects(query_box)), {});
// in c++03, spell out the end iterator: bgi::qend(tree)

size_t nbElements = boost::distance(r);

NOTE: size() is not available because the query_const_iterators are not of the random-access category.

不过结合起来可能会稍微舒服一些。比方说,如果您想对每个项目进行额外检查,您可以使用标准库算法,例如:

size_t matching = std::count_if(r.begin(), r.end(), some_predicate);

我认为基于范围的解决方案更灵活(相同的代码可用于实现其他算法,如 partial_sort_copystd::transform,这将很难适应输出- 来 self 的 earlier answer 的迭代器习语)。

关于c++ - boost R 树 : counting elements satisfying a query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29261563/

相关文章:

c++ - boost 安装 : missing argument global-setup

Android SQLite R-Tree - 如何安装模块?

c++ - (重新)使用空间索引库加载 R 树

c++ - 是什么使某些命名的函数/运算符与众不同?

c++ - MC 模拟中的 openmp 私有(private)/共享数据

c++ - 为什么我会收到此错误 : expected ')' before '&' token?

c++ - Boost:在单独的加载/保存函数中非侵入式地序列化一个类

indexing - R-Tree 和 Quadtree 比较

c++ - 为什么在调用重载赋值运算符时调用复制构造函数?

c++ - 你最喜欢的 C++ 编码风格习语是什么