Clasificación por bloques de elementos con std :: sort ()

Tengo una matriz de bordes, que se define como una matriz de dobles de estilo C, donde cada 4 dobles definen un borde, como este:

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]);

Así que quiero usarstd::sort() para ordenarlo por longitud de borde. Si fuera unstruct Edge { double x1, y1, x2, y2; }; Edge *p;, Seria bueno irme

Pero en este caso, la matriz doble tiene un tamaño de bloque que no está expresado por el tipo de puntero.qsort() le permite especificar explícitamente el tamaño del bloque, perostd::sort() infiere el tamaño de bloque por el tipo de puntero.

Por razones de rendimiento (uso de memoria y CPU), digamos que no es deseable crear nuevos arreglos o transformar el arreglo de alguna manera. Por razones de rendimiento, digamos que queremos usarstd::sort() en lugar deqsort().

Es posible llamarstd::sort() ¿Sin perder un solo ciclo de CPU en la transformación de los datos?

Posible enfoque:

Un enfoque obvio es tratar de forzar el puntero:

double *p = ...;
struct Edge { double arr[4]; };
Edge *p2 = reinterpret_cast<Edge*>(p);
std::sort(...);

Pero, ¿cómo me aseguro de que los datos estén alineados correctamente? Además, ¿cómo me aseguro de que siempre se alineará correctamente en todas las plataformas y arquitecturas?

O puedo usar untypedef double[4] Edge;?

Respuestas a la pregunta(10)

Su respuesta a la pregunta