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?
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;
?