www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Dense multidimensional std.container.array?

reply Wilson <sdfdsfsdfsd sdasd.com> writes:
Just wondering how to create a dense multidimensional array with 
the GC free array container? I don't want to use an array of 
arrays but I do want the array[0][0] notation.
Jan 26 2016
parent reply ZombineDev <valid_email he.re> writes:
On Tuesday, 26 January 2016 at 14:55:53 UTC, Wilson wrote:
 Just wondering how to create a dense multidimensional array 
 with the GC free array container? I don't want to use an array 
 of arrays but I do want the array[0][0] notation.
I suggest using std.experimental.ndslice [1] for multidimensional arrays and std.experimental.allocator [2] for GC-free allocation. For an introduction to the design ideas behind [2], you can also check Andrei's talk at DConf [3]. Here's an example: import std.stdio : writeln; import std.experimental.allocator : makeArray, dispose; import std.experimental.allocator.mallocator : Mallocator; import std.experimental.ndslice : sliced; void main() { ulong[] arr = Mallocator.instance.makeArray!ulong(36); scope (exit) Mallocator.instance.dispose(arr); // All of the below matrices refer to the same array // that was allocated above. auto matrix4x9 = arr.sliced(4, 9); // 2D 4x9 matrix auto matrix6x6 = arr.sliced(6, 6); // 2D 6x6 matrix auto matrix2x3x6 = arr.sliced(2, 3, 6); // 3D 2x3x6 matrix // matrix.length!N - gets the number of elements in the Nth dimention foreach (rowIdx; 0 .. matrix6x6.length!0) foreach (columnIdx; 0 .. matrix6x6.length!1) matrix6x6[rowIdx, columnIdx] = (rowIdx + 1) * 10 + columnIdx + 1; writeln (matrix6x6); writeln (matrix4x9); writeln (matrix2x3x6); // The memory allocated by arr will be freed implicitly here. } Which prints: [[11, 12, 13, 14, 15, 16], [21, 22, 23, 24, 25, 26], [31, 32, 33, 34, 35, 36], [41, 42, 43, 44, 45, 46], [51, 52, 53, 54, 55, 56], [61, 62, 63, 64, 65, 66]] [[11, 12, 13, 14, 15, 16, 21, 22, 23], [24, 25, 26, 31, 32, 33, 34, 35, 36], [41, 42, 43, 44, 45, 46, 51, 52, 53], [54, 55, 56, 61, 62, 63, 64, 65, 66]] [[[11, 12, 13, 14, 15, 16], [21, 22, 23, 24, 25, 26], [31, 32, 33, 34, 35, 36]], [[41, 42, 43, 44, 45, 46], [51, 52, 53, 54, 55, 56], [61, 62, 63, 64, 65, 66]]] [1]: http://dlang.org/phobos-prerelease/std_experimental_ndslice [2]: http://dlang.org/phobos-prerelease/std_experimental_allocator [3]: http://dconf.org/2015/talks/alexandrescu.html
Jan 26 2016
parent jmh530 <john.michael.hall gmail.com> writes:
On Tuesday, 26 January 2016 at 18:07:40 UTC, ZombineDev wrote:
 [snip]
Cool example.
Jan 26 2016