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