Sortowanie według bloków elementów za pomocą std :: sort ()

Mam tablicę krawędzi, która jest zdefiniowana jako tablica podwójnych stylów w stylu C, gdzie każde 4 podwójne definiuje krawędź, jak poniżej:

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

Więc chcę użyćstd::sort() sortować według długości krawędzi. Jeśli to byłostruct Edge { double x1, y1, x2, y2; }; Edge *p;, Dobrze byłoby iść.

Ale w tym przypadku podwójna tablica ma rozmiar bloku, który nie jest wyrażany przez typ wskaźnika.qsort() pozwala jawnie określić rozmiar bloku, alestd::sort() podaje rozmiar bloku według typu wskaźnika.

Ze względu na wydajność (zarówno wykorzystanie pamięci, jak i procesora), powiedzmy, że niepożądane jest tworzenie nowych tablic lub transformacja tablicy w jakiś sposób. Z powodów wydajności, powiedzmy, że chcemy użyćstd::sort() zamiastqsort().

Czy można zadzwonićstd::sort() bez marnowania pojedynczego cyklu CPU na transformację danych?

Możliwe podejście:

Oczywistym podejściem jest próba wymuszenia rzucania wskaźnika:

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

Ale jak mam się upewnić, że dane są odpowiednio wyrównane? Ponadto, jak mogę się upewnić, że będzie on zawsze poprawnie wyrównany na wszystkich platformach i architekturach?

Czy mogę użyć atypedef double[4] Edge;?

questionAnswers(10)

yourAnswerToTheQuestion