How to append range to array?

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun May 24 19:13:25 PDT 2015


On 5/23/15 4:27 AM, Jonathan M Davis via Digitalmars-d-learn wrote:
> On Saturday, May 23, 2015 07:03:33 Vladimir Panteleev via Digitalmars-d-learn wrote:
>> int[] arr = [1, 2, 3];
>> auto r = iota(4, 10);
>> // ???
>> assert(equal(arr, iota(1, 10)));
>>
>> Hopefully in one GC allocation (assuming we know the range's
>> length).
>>
>> I tried std.range.primitives.put but its behavior seems a little
>> mysterious:
>>
>> This compiles but asserts at runtime:
>>
>> int[] arr = [1, 2, 3];
>> arr.put(iota(4, 10));
>>
>> And this is even weirder, can you guess what it will print?
>>
>> int[] arr = [1, 2, 3];
>> arr.put(4);
>> writeln(arr);
>
> For better or worse, put does not append to arrays. It fills them. If you
> want to append using put, then using std.array.Appender.

Yes, think of an array as a buffer. When you put into it, you are 
overwriting the contents.

In addition to using Appender (which BTW will add an allocation), you 
can extend the array and then fill the extended slice:

auto oldlen = arr.length;
arr.length += someRange.length;
put(arr[oldlen..$], someRange);

I wish there was a shorter way to do this...

-Steve


More information about the Digitalmars-d-learn mailing list