Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
August 13, 2013 Using zip to copy subarray into another | ||||
---|---|---|---|---|
| ||||
I have code that attempts to copy a slice of one array into another using zip. However, the array is not updated. I am guessing this is because modifying the returned tuple does not modify the actual arrays. Is there any way to do this. import std.stdio; import std.range; void main( string[] args ) { int[] array1 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; int[] array2 = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]; foreach( ref a; zip(array1[2..$], array2[4..6] ) ) { a[0] = a[1]; } foreach( int v; array1 ) write(v, ","); } prints 1,1,1,1,... Thanks Craig |
August 13, 2013 Re: Using zip to copy subarray into another | ||||
---|---|---|---|---|
| ||||
Posted in reply to Craig Dillabaugh | On Tuesday, August 13, 2013 21:22:24 Craig Dillabaugh wrote:
> I have code that attempts to copy a slice of one array into another using zip. However, the array is not updated. I am guessing this is because modifying the returned tuple does not modify the actual arrays.
>
> Is there any way to do this.
Why not just use std.algorithm.copy, or even just assigning one array to the other? e.g.
dest[2 .. 5] = src[1 .. 4];
- Jonathan M Davis
|
August 13, 2013 Re: Using zip to copy subarray into another | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | On Tuesday, 13 August 2013 at 19:50:37 UTC, Jonathan M Davis
wrote:
> On Tuesday, August 13, 2013 21:22:24 Craig Dillabaugh wrote:
>> I have code that attempts to copy a slice of one array into
>> another using zip. However, the array is not updated. I am
>> guessing this is because modifying the returned tuple does not
>> modify the actual arrays.
>>
>> Is there any way to do this.
>
> Why not just use std.algorithm.copy, or even just assigning one array to the
> other? e.g.
>
> dest[2 .. 5] = src[1 .. 4];
>
> - Jonathan M Davis
These work reasonably well and I will likely use your suggestions
here.
The one thing I get with zip that I lose using std.algorithm.copy
or straight assignment of the slices is that it handles
mismatches in slice sizes automatically (it stops as soon as
either slice is exhausted).
For example
copy(array2[4..8], array1[9..$]);
where array1 had 10 elements fails because it copies data off the
end of array1, and if I use straight assignment the slices must
be the same length.
Craig
|
August 13, 2013 Re: Using zip to copy subarray into another | ||||
---|---|---|---|---|
| ||||
Posted in reply to Craig Dillabaugh | On Tuesday, 13 August 2013 at 20:23:00 UTC, Craig Dillabaugh wrote:
> On Tuesday, 13 August 2013 at 19:50:37 UTC, Jonathan M Davis
> wrote:
>> On Tuesday, August 13, 2013 21:22:24 Craig Dillabaugh wrote:
>>> I have code that attempts to copy a slice of one array into
>>> another using zip. However, the array is not updated. I am
>>> guessing this is because modifying the returned tuple does not
>>> modify the actual arrays.
>>>
>>> Is there any way to do this.
>>
>> Why not just use std.algorithm.copy, or even just assigning one array to the
>> other? e.g.
>>
>> dest[2 .. 5] = src[1 .. 4];
>>
>> - Jonathan M Davis
>
> These work reasonably well and I will likely use your suggestions
> here.
>
> The one thing I get with zip that I lose using std.algorithm.copy
> or straight assignment of the slices is that it handles
> mismatches in slice sizes automatically (it stops as soon as
> either slice is exhausted).
>
> For example
>
> copy(array2[4..8], array1[9..$]);
>
> where array1 had 10 elements fails because it copies data off the
> end of array1, and if I use straight assignment the slices must
> be the same length.
>
> Craig
warning: untested!
void myCopy(T)(T[] a, T[] b)
{
auto possible = min(a.length, b.length);
a[0 .. possible] = b[0 .. possible];
}
myCopy(array2[4..8], array1[9..$]);
Arrays only atm, but you could quite easily spruce that up in to something much more generic.
|
August 13, 2013 Re: Using zip to copy subarray into another | ||||
---|---|---|---|---|
| ||||
Posted in reply to Craig Dillabaugh | On 08/13/2013 09:22 PM, Craig Dillabaugh wrote: > I have code that attempts to copy a slice of one array into another using zip. However, the array is not updated. I am guessing this is because modifying the returned tuple does not modify the actual arrays. > > Is there any way to do this. Try lockstep instead of zip. See: http://d.puremagic.com/issues/show_bug.cgi?id=8155#c8 ... for more info on the reasons why zip doesn't work here. |
August 14, 2013 Re: Using zip to copy subarray into another | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On Tuesday, 13 August 2013 at 21:10:53 UTC, John Colvin wrote:
> On Tuesday, 13 August 2013 at 20:23:00 UTC, Craig Dillabaugh wrote:
>> On Tuesday, 13 August 2013 at 19:50:37 UTC, Jonathan M Davis
>> wrote:
>>> On Tuesday, August 13, 2013 21:22:24 Craig Dillabaugh wrote:
>>>> I have code that attempts to copy a slice of one array into
>>>> another using zip. However, the array is not updated. I am
>>>> guessing this is because modifying the returned tuple does not
>>>> modify the actual arrays.
>>>>
>>>> Is there any way to do this.
>>>
>>> Why not just use std.algorithm.copy, or even just assigning one array to the
>>> other? e.g.
>>>
>>> dest[2 .. 5] = src[1 .. 4];
>>>
>>> - Jonathan M Davis
>>
>> These work reasonably well and I will likely use your suggestions
>> here.
>>
>> The one thing I get with zip that I lose using std.algorithm.copy
>> or straight assignment of the slices is that it handles
>> mismatches in slice sizes automatically (it stops as soon as
>> either slice is exhausted).
>>
>> For example
>>
>> copy(array2[4..8], array1[9..$]);
>>
>> where array1 had 10 elements fails because it copies data off the
>> end of array1, and if I use straight assignment the slices must
>> be the same length.
>>
>> Craig
>
>
> warning: untested!
>
> void myCopy(T)(T[] a, T[] b)
> {
> auto possible = min(a.length, b.length);
> a[0 .. possible] = b[0 .. possible];
> }
>
> myCopy(array2[4..8], array1[9..$]);
>
> Arrays only atm, but you could quite easily spruce that up in to something much more generic.
Thanks. I ended up using something along these lines in my code
(although I didn't write a nice generic function as you have
done).
|
August 14, 2013 Re: Using zip to copy subarray into another | ||||
---|---|---|---|---|
| ||||
Posted in reply to Joseph Rushton Wakeling | On Tuesday, 13 August 2013 at 21:37:28 UTC, Joseph Rushton
Wakeling wrote:
clip.
>
> Try lockstep instead of zip. See:
> http://d.puremagic.com/issues/show_bug.cgi?id=8155#c8
>
> ... for more info on the reasons why zip doesn't work here.
While I've now solved my problem using a slightly different
method, you are right lockstep would have also likely made a good
solution.
Thanks.
|
Copyright © 1999-2021 by the D Language Foundation