Thread overview
.dup with twodimensional arrays
Mar 21, 2018
berni
Mar 21, 2018
berni
Mar 21, 2018
berni
March 21, 2018
I need code, that generates a copy of a twodimensional array.

What I do is:

> auto tmp = new int[][](X,X);
> foreach (i; 0..X) tmp[i] = solution[i].dup;
> 
> solutions ~= tmp;

because solutions ~= solution.dup obviously doesn't work (the refs are copied, not the elements of the inner arrays).

Is there a better solution without this extraneous tmp variable? Im thinking of something like

> solutions ~= solution.nice_phobos_function_id_dont_know.dup;

or something similar?
March 21, 2018
Oops, sorry. I just have seen, that I posted in the wrong forum, should have been in "New users Learn". Is it possible to move this post over?
March 21, 2018
On 3/21/18 5:59 AM, berni wrote:
> I need code, that generates a copy of a twodimensional array.
> 
> What I do is:
> 
>> auto tmp = new int[][](X,X);
>> foreach (i; 0..X) tmp[i] = solution[i].dup;
>>
>> solutions ~= tmp;
> 
> because solutions ~= solution.dup obviously doesn't work (the refs are copied, not the elements of the inner arrays).
> 
> Is there a better solution without this extraneous tmp variable? Im thinking of something like
> 
>> solutions ~= solution.nice_phobos_function_id_dont_know.dup;
> 
> or something similar?

I don't think there is, but you could potentially use map and array:

import std.algorithm: map;
import std.array: array;

solutions ~= tmp
   .map!(a => a.dup) // every access to an element dups it first
   .array;           // build an array out of the result

I'm not 100% sure array only calls front once per element, but I'm pretty sure.

On 3/21/18 6:01 AM, berni wrote:
> Oops, sorry. I just have seen, that I posted in the wrong forum, should
> have been in "New users Learn". Is it possible to move this post over?

Sorry, posts can't be moved, but no big deal :)

-Steve
March 21, 2018
On Wednesday, 21 March 2018 at 10:26:03 UTC, Steven Schveighoffer wrote:
> import std.algorithm: map;
> import std.array: array;
>
> solutions ~= tmp
>    .map!(a => a.dup) // every access to an element dups it first
>    .array;           // build an array out of the result

Oh, thanks, that's already better. (And with ldc it's much faster, saves about half of the time).
March 21, 2018
On Wednesday, 21 March 2018 at 09:59:52 UTC, berni wrote:
> I need code, that generates a copy of a twodimensional array.
>
> What I do is:
>
>> auto tmp = new int[][](X,X);
>> foreach (i; 0..X) tmp[i] = solution[i].dup;
>> 
>> solutions ~= tmp;
>
> because solutions ~= solution.dup obviously doesn't work (the refs are copied, not the elements of the inner arrays).
>
> Is there a better solution without this extraneous tmp variable? Im thinking of something like
>
>> solutions ~= solution.nice_phobos_function_id_dont_know.dup;
>
> or something similar?

If you happen to need more extensive utilities for multi-dimensional arrays, I strongly recommend taking a look at https://github.com/libmir/mir-algorithm. For example, for the general case of creaing an N-dimensional array, I think this is the function you need: http://docs.algorithm.dlang.io/latest/mir_ndslice_allocation.html#makeNdarray. Before, part of this functionality of libmir was part of the standard library, but due to the explosive growth of the package it was deemed better to keep its developement as a separate dub packages - http://code.dlang.org/search?q=mir.