Вектор сортировки пространственных (2D / 3D) векторов по компонентам 1, 2 (и 3) - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть шаблонный вектор v из class T (либо float, либо double), содержащий N*D (= npoints*ndims) элементов. Например, для D = 2 v будет содержать [ p0[0], p0[1], p1[0], p1[1], p2[0], p2[1], ... pN-1[0], pN-1[1] ].

Я хотел бы получить вектор lsort из N индексов, которые соответствуют сортировке точек по возрастанию, сначала по координате 0, а затем по координате 1. Нет совпадающих точек.

Например, если точки (p0 ... pN-1) равны ((0,0), (0,1), (1,2), (1,0)), я имею в виду:

v = [ 0, 0, 0, 1, 1, 2, 1, 0 ]
lsort = [ 0, 1, 3, 2 ]

, поскольку p3 имеет ту же координату 0, что и p2, но более низкую координату 1.

Меня не волнует получение отсортированного вектора (я мог бы сделать это, как только у меня будет lsort).

Раньше я делал сравнения с пользовательскими операторами, но я не выясняю, как сравнение пропускает все остальные элементы.

1 Ответ

0 голосов
/ 12 сентября 2018

Сначала сгенерируйте векторный контейнер указателей с плавающей точкой (или альтернативно: итераторы), где элемент указывает на каждый D-й элемент, т.е. на первое измерение каждого пространственного вектора.

Затем std::sort этот векторуказатели, использующие пользовательскую функцию сравнения, которая выполняет лексикографическое сравнение left[0], right[0], затем left[1], right[1] до, наконец, left[D-1], right[D-1], если все предыдущие сравнения были равны.

Теперь у вас есть векторный контейнер указателей для каждого пространственноговектор, в нужной вам сортировке.Если вы хотите получить индексы этих пространственных векторов, просто вычтите указатель на первый элемент v из каждого элемента вектора указателя.Это будет индекс в пределах v.Разделите на D, чтобы получить индекс, соответствующий вашему примеру вывода.

Кроме того, вы можете начать с последовательности индексов от 0 до D-1, сгенерированной с помощью std::iota, и использовать более сложную функцию сравнения, которая выполняет перевод из индекса в координату.

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