Что такое OutputIterator и как его создать для использования с CGAL Kd_tree :: search? - PullRequest
0 голосов
/ 13 ноября 2011

Я использую реализацию Kd-дерева в CGAL вместе с сферическими нечеткими объектами в качестве объектов запроса, чтобы получить точки, заключенные в сферу радиусом 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;
    }

Я взял и адаптировал строку под комментарием «Точки печати» из файла near_neighbor_searching.cpp в папке Spatial_searching примеров CGAL (моя версия 3.9).

Вопрос в следующем: есть ли способ установить для меня другой OutputIterator (вместо std::ostream_iterator), который хранит указатель / итератор / дескриптор для точек, полученных в результате поиска в контейнере сортов?, вместо с координатами точек, напечатанными на стандартный вывод?Спасибо.

Ответы [ 2 ]

4 голосов
/ 13 ноября 2011

В стандартной библиотеке C ++ существует пять видов итераторов:

  • Итератор ввода
  • Итератор вывода
  • Итератор прямого действия
  • Двунаправленный итераторИтератор
  • Итератор с произвольным доступом

Для получения дополнительной информации см. cplusplus.com

В вашем случае вам необходим вывод итератор , т. е. объект it, который может быть увеличен (++it) и разыменован (*it) для получения неконстантной ссылки, в которую можно записать.

Вы можете создать выходной итератор, который вставит все элементы, записанные в него в конце контейнера, используя std::back_inserter:

#include <iterator>
#include <vector>

...

std::vector<Point> points;
tree.search(std::back_inserter(points), s_query);
0 голосов
/ 08 февраля 2013

В CGAL развивались вещи, то есть вы можете хранить другие вещи, а не только очки.Посмотрите Примеры использования произвольного типа точек с картами свойств точек в Руководстве пользователя.

...