Sortieren nach Elementblöcken mit std :: sort ()

Ich habe ein Array von Kanten, das als C-artiges Array von Doppelwerten definiert ist, wobei alle 4 Doppelwerte eine Kante definieren, wie folgt:

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

Also möchte ich nutzenstd::sort() um es nach Kantenlänge zu sortieren. Wenn es eine wärestruct Edge { double x1, y1, x2, y2; }; Edge *p;Ich wäre gut zu gehen.

In diesem Fall hat das Double-Array jedoch eine Blockgröße, die nicht durch den Zeigertyp ausgedrückt wird.qsort() Damit können Sie die Blockgröße explizit angeben, aberstd::sort() leitet die Blockgröße ab durch den Zeigertyp.

Nehmen wir aus Gründen der Leistung (sowohl der Speichernutzung als auch der CPU) an, dass es unerwünscht ist, neue Arrays zu erstellen oder das Array irgendwie zu transformieren. Nehmen wir noch einmal aus Performancegründen an, dass wir verwenden möchtenstd::sort() anstattqsort().

Ist es möglich anzurufenstd::sort() ohne einen einzigen CPU-Zyklus für die Transformation der Daten zu verschwenden?

Möglicher Ansatz:

Ein naheliegender Ansatz besteht darin, den Zeiger zwangsweise zu werfen:

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

Aber wie stelle ich sicher, dass die Daten richtig ausgerichtet sind? Wie stelle ich außerdem sicher, dass es auf allen Plattformen und Architekturen immer richtig ausgerichtet ist?

Oder kann ich eintypedef double[4] Edge;?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage