sort struct of arrays
Rene Zwanenburg via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri May 9 09:26:21 PDT 2014
On Friday, 9 May 2014 at 15:52:51 UTC, John Colvin wrote:
> 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.
It's probably better to use makeIndex:
http://dlang.org/phobos/std_algorithm.html#makeIndex
More information about the Digitalmars-d-learn
mailing list