sort struct of arrays

John Colvin via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri May 9 09:44:01 PDT 2014


On Friday, 9 May 2014 at 16:26:22 UTC, Rene Zwanenburg wrote:
> 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

good call, I didn't realise that existed.


More information about the Digitalmars-d-learn mailing list