D slicing

Ali Çehreli acehreli at yahoo.com
Mon Jun 17 16:48:36 PDT 2013


On 06/17/2013 04:34 PM, Colin Grogan wrote:

 > Wondering what way I'd go about this, I want to slice an array into two
 > arrays. First array containing every even index (i.e. 0,2,4,6,8..$)
 > Second slice containing every odd index (i.e. 1,3,5,7,9..$) <-- be some
 > issue with using $ depending on if orig length is odd or even. Can work
 > that out easily enough...
 >
 > Reading the articles on array slicing its not clear if its possible.
 >
 > Ideally, I could do something like the following:
 >
 > auto orig = [1,2,3,4,5,6,7];
 > auto sliceEven = orig[0..$..2];
 > auto sliceOdd = orig[1..$..2];

If you want the data sit where it is but simply have different views in 
it, then you must use ranges. There are multiple ways.

Here is one using std.range.stride:

import std.stdio;
import std.range;

void main()
{
     auto orig = [0, 1, 2, 3, 4, 5, 6, 7];

     auto sliceEven = orig.stride(2);
     auto sliceOdd = orig.dropOne.stride(2);

     writeln(sliceEven);
     writeln(sliceOdd);
}

The output:

[0, 2, 4, 6]
[1, 3, 5, 7]

Or you can generate the indexes and then get a view that way:

     auto sliceEven = orig.indexed(iota(0, orig.length, 2));
     auto sliceOdd = orig.indexed(iota(1, orig.length, 2));

Ali



More information about the Digitalmars-d-learn mailing list