究竟什么是OutputIterator以及如何构建一个用于CGAL Kd_tree :: search?

时间:2011-11-13 09:09:40

标签: c++ class iterator kdtree cgal

我正在使用CGAL的Kd树实现以及模糊球体作为查询对象来获取包围在以点为中心的半径r_max的球体中的点。这是最小的工作示例:

    #include <CGAL/Simple_cartesian.h>
    #include <CGAL/Kd_tree.h>
    #include <CGAL/Search_traits_2.h>
    #include <CGAL/Fuzzy_sphere.h>
    #include <iostream>
    #include <fstream>

    typedef CGAL::Simple_cartesian<double>  K;
    typedef K::Point_2                      Point;
    typedef CGAL::Search_traits_2<K>        TreeTraits;
    typedef CGAL::Kd_tree<TreeTraits>       Kd_tree;
    typedef Kd_tree::Tree                   Tree;
    typedef CGAL::Fuzzy_sphere<TreeTraits>  Sphere;

    int main(int argc, char* argv[])
    {
        double r_max;
        Tree tree;

        /* ... fill the tree with points, set the value of r_max ...*/

        // Report indices for the neighbors within a sphere
        unsigned int   idc_query = tree.size()/2;           // test index
        Tree::iterator kti       = idc_query + tree.begin();                                                                                
        Sphere s_query(*kti, r_max);                            

        // Print points
        tree.search(std::ostream_iterator<Point>(std::cout, "\n"), s_query);

        return 0;
    }

我从CGAL示例的Spatial_searching文件夹下的nearest_neighbor_searching.cpp文件中获取并修改了评论“打印点”下面的行(我的版本是3.9)。

问题是:我有没有办法设置一个不同的OutputIterator(而不是std::ostream_iterator)来存储指针/迭代器/句柄到搜索容器中的点所产生的点将点的坐标打印到标准输出?而不是?谢谢。

2 个答案:

答案 0 :(得分:4)

在C ++标准库中,有五种迭代器:

  • 输入迭代器
  • 输出迭代器
  • 转发迭代器
  • 双向迭代器
  • 随机访问迭代器

有关详细信息,请参阅cplusplus.com

在您的情况下,您需要一个输出迭代器,即一个可以递增(it)和取消引用的对象++it({{1}获取非const引用,可以写入。

您可以创建一个输出迭代器,使用std::back_inserter插入容器末尾写入的所有项目:

*it

答案 1 :(得分:0)

CGAL已经发展了一些东西,那就是你可以储存除点之外的其他东西。请查看用户手册中的Examples for Using an Arbitrary Point Type with Point Property Maps