В приложении я измеряю множество двухмерных координат (x, y) шаблона. Этот шаблон состоит из набора точек на сетке с фиксированными шагами в направлениях x и y. Все эти координаты имеют оценку качества и сортируются по этой оценке. Я хочу сначала отсортировать эти координаты по x и определить группы (области) x-координат, которые принадлежат друг другу. После этого шага я хочу отсортировать различные x-регионы в y-регионах.
После этого я могу пометить координаты соответствующей меткой шаблона (сетки).
Пример: Измеренные координаты (x, y) = (2,2), (2,3), (1,2), (1,3), (2,1), (1,1), (3,2 ), (3,3), (3, 1)
После шага 1: (x, y) = (1,2), (1,3), (1,1) (2,2), (2,3), (2,1) (3,2), (3,3), (3,1)
После шага 2: (x, y) = (1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1 ), (3,2), (3, 3)
Есть ли процедура сортировки, которая уже выполняет эту задачу? Процедура также должна работать, если некоторые координаты рисунка не измерены.
Может кто-нибудь подскажет, я не опытный программист на C ++, но, возможно, с некоторыми подсказками я справлюсь с этой работой!
3 ответа
Если вы знаете диапазон ваших чисел, вы можете умножить X на какое-то большое число, а затем добавить y к этому числу. Теперь вы можете просто отсортировать это число или использовать библиотеку stl, чтобы сделать это, как описано другими.
Вам нужен стабильный алгоритм сортировки (ведьма не меняет порядок равных элементов). Сначала выполните сортировку по координате y
, а затем выполните сортировку по x
, чтобы получить желаемый результат:
std::stable_sort(points.begin(), points.end(), yComparator());
std::stable_sort(points.begin(), points.end(), xComparator());
Например:
перед: (x, y) = (2,2), (2,3), (1,2), (1,3), (2,1), (1,1), (3,2), (3,3), (3,1)
отсортировано по y: (x, y) = (2,1), (1,1), (3,1), (2,2), (1,2), (3,2), (2,3 ), (1,3), (3,3)
отсортировано по x: (x, y) = (1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1 ), (3,2), (3,3)
Вы можете сделать это с помощью std::sort
и пользовательского operator<
, например:
#include <algorithm>
#include <vector>
struct coord {
double x,y,quality;
};
bool operator<(const coord& a, const coord& b) {
return a.quality < b.quality;
}
int main() {
std::vector<coord> coords;
std::sort(coords.begin(), coords.end());
}
Если вы не хотите, чтобы «качество» сохранялось в структуре, вы всегда можете вызвать некоторую функцию для его вычисления напрямую в operator<
, например:
double quality(const coord& c);
bool operator<(const coord& a, const coord& b) {
return quality(a) < quality(b);
}
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .