Я надеюсь, что кто-то может помочь мне с 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());
}
Как мне написать эту функцию (с повышением или чем-то еще) или есть альтернативное решение моей проблемы? Кто-нибудь может мне помочь? Заранее спасибо