sort struct of arrays

John Colvin via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri May 9 08:52:50 PDT 2014


On Friday, 9 May 2014 at 14:23:41 UTC, Luís Marques wrote:
> If you have an array of structs, such as...
>
>      struct Foo
>      {
>          int x;
>          int y;
>      }
>
>      Foo[] foos;
>
> ...and you wanted to sort the foos then you'd do something 
> like...
>
>      foos.sort!(a.x < b.x),
>
> ..and, of course, both of the fields x and y get sorted 
> together.
> If you have a so-called struct of arrays, or an equivalent
> situation, such as...
>
>      int[] fooX;
>      int[] fooY;
>
> ...is there a simple way to sort fooX and fooY
> "together"/coherently (keyed on, say, fooX), using the standard
> lib?

For some situations (expensive/impossible to move/copy elements 
of fooY), you would be best with this:

auto indices = zip(iota(fooX.length).array, fooX).sort!"a[1] < 
b[1]".map!"a[0]";
auto sortedFooY = fooY.indexed(indices);

bearing in mind that this causes an allocation for the index, but 
if you really can't move the elements of fooY (and fooX isn't 
already indices of fooY) then you don't have much of a choice.


More information about the Digitalmars-d-learn mailing list