Classificando por blocos de elementos com std :: sort ()

Eu tenho uma matriz de arestas, que é definida como uma matriz do estilo C de duplas, onde cada 4 duplas definem uma aresta, como esta:

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

Então eu quero usarstd::sort() para classificá-lo pelo comprimento da aresta. Se fosse umstruct Edge { double x1, y1, x2, y2; }; Edge *p;, Eu seria bom ir.

Mas neste caso, o array duplo tem um tamanho de bloco que não é expresso pelo tipo de ponteiro.qsort() permite especificar explicitamente o tamanho do bloco, masstd::sort() infere o tamanho do bloco pelo tipo de ponteiro.

Por motivos de desempenho (uso de memória e CPU), digamos que seja indesejável criar novos arrays ou transformar o array de alguma forma. Por motivos de desempenho novamente, digamos que queremos usarstd::sort() ao invés deqsort().

É possível ligarstd::sort() sem desperdiçar um único ciclo de CPU na transformação dos dados?

Abordagem possível:

Uma abordagem óbvia é tentar forçar o ponteiro:

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

Mas como posso ter certeza de que os dados estão alinhados corretamente? Além disso, como posso ter certeza de que sempre estará alinhado corretamente em todas as plataformas e arquiteturas?

Ou posso usar umtypedef double[4] Edge;?

questionAnswers(10)

yourAnswerToTheQuestion