Сортировка по блокам элементов с помощью std :: sort ()
У меня есть массив ребер, который определяется как массив двойных чисел в стиле C, где каждые 4 двойных определяют ребро, например:
double *p = ...;
printf("edge1: %lf %lf %lf %lf\n", p[0], p[1], p[2], p[3]);
printf("edge2: %lf %lf %lf %lf\n", p[4], p[5], p[6], p[7]);
Поэтому я хочу использоватьstd::sort()
отсортировать по длине ребра. Если бы это былоstruct Edge { double x1, y1, x2, y2; }; Edge *p;
Я был бы хорошо пойти.
Но в этом случае двойной массив имеет размер блока, который не выражается типом указателя.qsort()
позволяет явно указать размер блока, ноstd::sort()
выводит размер блока по типу указателя.
С точки зрения производительности (как использования памяти, так и процессора), допустим, нежелательно создавать новые массивы или каким-либо образом преобразовывать массив. Снова по соображениям производительности, скажем, что мы хотим использоватьstd::sort()
вместоqsort()
.
Можно ли позвонитьstd::sort()
не тратя ни одного цикла процессора на преобразование данных?
Очевидный подход - попытаться принудительно привести указатель:
double *p = ...;
struct Edge { double arr[4]; };
Edge *p2 = reinterpret_cast<Edge*>(p);
std::sort(...);
Но как мне убедиться, что данные выровнены правильно? Кроме того, как мне убедиться, что он всегда будет правильно выровнен на всех платформах и архитектурах?
Или я могу использоватьtypedef double[4] Edge;
?