foreach(i,ref val; ndim_arr)??
9il via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue May 10 09:55:54 PDT 2016
On Tuesday, 10 May 2016 at 15:18:50 UTC, ZombineDev wrote:
> On Tuesday, 10 May 2016 at 10:21:30 UTC, ZombineDev wrote:
>
> (You can try it at: https://dpaste.dzfl.pl/c0327f067fca)
>
> import std.array : array;
> import std.experimental.ndslice : byElement, indexSlice, sliced;
> import std.range : iota, lockstep, zip;
> import std.stdio : writefln;
>
> void main()
> {
> // needs .array for ref (lvalue) access
> // (iota offers only rvalues)
> auto slice = iota(2 * 3 * 4).array.sliced(2, 3, 4);
>
> auto indexed_range = lockstep(
> slice.shape.indexSlice.byElement(),
> slice.byElement()
> );
>
> writefln("%s", slice);
>
> foreach (idx, ref elem; indexed_range)
> writefln("Element at %s = %s", idx, ++elem);
> }
>
The code above is slow because it calculates index using multiple
assembler ops.
Following would be faster:
for(auto elems = slice.byElement; !elems.empty; elems.popFront)
{
size_t[2] index = elems.index;
elems.front = index[0] * 10 + index[1] * 3;
}
For really fast code just use multiple foreach loops:
foreach(i; matrix.length)
{
auto row = matrix[i]; // optional
foreach(j; matrix.length!1)
{
...
}
}
More information about the Digitalmars-d-learn
mailing list