Сортировка по блокам элементов с помощью 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;?

Ответы на вопрос(10)

Ваш ответ на вопрос