C ++ Способ упорядочивания связанных векторов очень большого размера или итерация во вложенное поле структуры с ускорением слияния adap_struct - PullRequest
0 голосов
/ 09 мая 2020

Я надеюсь, что кто-то может помочь мне с 2 вопросами.

1) Я использую библиотеку CGAL, и у меня очень большой вектор объектов Point_2, и я хочу их заказать. Просто я беру начальную точку и упорядочиваю их по соседу:

        vector<K::Point_2> points;
        // ... vector assignment

        K::Point_2 first_point(0,0);

        // Search N points every iter
        const unsigned int N = 1;

        Tree tree(points.begin(), points.end());

        // Initialize the search structure, and search all points
        Neighbor_search search(tree, first_point, points.size());

        // report the N nearest neighbors and their distance
        // This should sort all N points by increasing distance from origin
        for (Neighbor_search::iterator it = search.begin(); it != search.end(); ++it) {
            printf("Point [%.0f,%.0f]\tat distance: %.4f\n", it->first.x(), it->first.y(), sqrt(it->second));
        }

Но теперь у меня проблема: , если я хочу знать положение каждой Point_2 в начальном векторе, который я должен использовать find () для каждой Point_2 и получите индекс. Это невероятная трата времени / ресурсов.

Если сначала я сохраню индексы каждой Point_2 в векторе, то как мне упорядочить вектор Point_2, чтобы вектор индексов также был заказал соответственно? Помните: мне нужно использовать функцию Neighbor_search для сортировки.

Единственная идея, которую я придумал, - это создать структуру Ipoint {Point_2, index} и переписать итератор для работы с элементом Point_2 структуры

Таким образом я мог получить правильное создание Tree tree (points.begin (), points.end ()) и завершить метод сортировки, как если бы они были простыми Point_2 (по крайней мере, я полагаю).

И вот мы подошли к последнему вопросу: мне нужно получить итераторы «begin ()» и «end ()», которые прокручивают поле структуры, вложенное в вектор. Что-то вроде этого: C ++ итерация во вложенное поле структуры с помощью boost fusion adap_struct ... но мне нужны объекты итераторов как возвращаемые значения в main.

typedef CGAL::Simple_cartesian<double> K;

struct Ipoint{
    K::Point_2 p;
    int idx;
};

BOOST_FUSION_ADAPT_STRUCT
(
    Ipoint,
    (K::Point_2, p)
    (int, idx)
)

//
// struct with boost for operator() or something else
//

int main(int argc, char *argv[]) {

  vector<Ipoint> points;
  for(int i = 0; i < 10; i++){
    points.push_back(Ipoint{ K::Point_2(0, 0), i });
  }


  // I would like these 2 iterators to refer to K::Point_2 p of Ipoint objects that are in the vector points

  Tree tree(points.begin(), points.end());
}

Как мне написать эту функцию (с повышением или чем-то еще) или есть альтернативное решение моей проблемы? Кто-нибудь может мне помочь? Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...