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