View mode: basic / threaded / horizontal-split · Log in · Help
September 09, 2012
Associative array of dynamic array
I would like to create an associative array that maps a string to 
a multidimensional dynamic array. In other words, I would like a 
data structure where I can access elements like this:

foo["key"][0][0]

Is this possible? If so I'm having trouble figuring out the 
correct syntax, the following (for one dimension) doesn't work:

auto foo = new int[5][string];

compilation fails with the following message:
Error: cannot implicitly convert expression (string) of type 
string to ulong

Thanks for any help!
September 09, 2012
Re: Associative array of dynamic array
On Sun, Sep 9, 2012 at 2:18 PM, Samuele Carcagno <sam.carcagno@gmail.com> wrote:
> I would like to create an associative array that maps a string to a
> multidimensional dynamic array. In other words, I would like a data
> structure where I can access elements like this:
>
> foo["key"][0][0]

The type you want is int[][][string]. You can use it like this:

alias int[][][string] MyArray;

void main()
{
   MyArray foo;
   foo["abc"] = [[0,1,2], [3,4], []];
   foo["def"] = [[0]];
   assert(foo["abc"][0][1] == 1);
}
September 09, 2012
Re: Associative array of dynamic array
On Sunday, 9 September 2012 at 12:17:47 UTC, Samuele Carcagno 
wrote:
> I would like to create an associative array that maps a string 
> to a multidimensional dynamic array. In other words, I would 
> like a data structure where I can access elements like this:
>
> foo["key"][0][0]
>
> Is this possible? If so I'm having trouble figuring out the 
> correct syntax, the following (for one dimension) doesn't work:
>
> auto foo = new int[5][string];
>
> compilation fails with the following message:
> Error: cannot implicitly convert expression (string) of type 
> string to ulong
>
> Thanks for any help!

Other way round. Unlike C++, everything goes before the 
identifier:

--------
import std.stdio;
void main()
{
    int[][][string] foo;
    foo["hello"]=[[1],[2]];
    writeln(foo["hello"]);
    writeln(foo["hello"][0][0]);
}
-------
[[1], [2]]
1
-------
foo is an associative array, the key is "string", and the type is 
"int[][]"
September 09, 2012
Re: Associative array of dynamic array
thanks a lot! both solutions work, to initialize the arrays of 
int I'm doing:

int[][][string] foo;
foo["key"] = new int[][](6,6);
foo["key"][0][0] = 5;

it seems to work.
September 09, 2012
Re: Associative array of dynamic array
On Sun, Sep 9, 2012 at 2:48 PM, Samuele Carcagno <sam.carcagno@gmail.com> wrote:
> thanks a lot! both solutions work, to initialize the arrays of int I'm
> doing:
>
> int[][][string] foo;
> foo["key"] = new int[][](6,6);
> foo["key"][0][0] = 5;
>
> it seems to work.

Great!

Keep in mind all these structures (AA and dynamic arrays) are
reference types. If you copy the associative array, you just copy the
references and any change in one will affect the other. Also,
internally:

alias int[][][string] MyArray;

void main()
{
   MyArray foo;
   foo["abc"] = [[0,1,2], [3,4], []];
   assert(foo["abc"][0][1] == 1);

// internal copy
   foo["def"] = foo["abc"];
   foo["def"][0][1] = 2;
   assert(foo["abc"][0][1] == 2);

// external copy
   auto bar = foo;
   bar["ghi"] = foo["abc"];
   bar["ghi"][0][1] = 3;
   assert(foo["abc"][0][1] == 3 &&  foo["def"][0][1] == 3);

}
September 09, 2012
Re: Associative array of dynamic array
Philippe Sigaud:

> Keep in mind all these structures (AA and dynamic arrays) are
> reference types.

There are bug-prone things you have to keep in mind.

Not exactly a reference type, this is by D specs:


import std.stdio;
import std.array: popFront;
void main() {
     auto d = [1:[2, 3]];
     auto l = d[1];
     auto l2 = l[0];
     l.popFront();
     writeln(d, "  ", l, "  ", l2);
}


Even AAs (I don't know if this is an implementation bug or if 
this is by D specs, opinions welcome):

void test(int[int] arraya, int x) {
     arraya[x] = x;
}
void main() {
     int[int] d;
     test(d, 0);
     int[int] d0;
     assert(d == d0); // d is empty, 0:0 is lost
     d[1] = 1;
     test(d, 2);
     assert(d == [1: 1, 2: 2]); // now 2:2 is not lost
}

Bye,
bearophile
Top | Discussion index | About this forum | D home