I have two dimensional map
map <int, map<int, int>> _map;
The first type of initialization works well:
int i = 1,  j = 2,  k = 3;
map <int, map<int, int>> _map;
_map[i][j] = 100;
_map[i][k] = 200;
std::cout << _map[i][j] << ":" << _map[i][k] << std::endl; 
Thus it prints:
100:200
However, the second initialization fails:
map <int, map<int, int>> _map = {
    {1, {{2, 100}}},
    {1, {{3, 200}}}
  };
  std::cout << _map[i][j] << ":" << _map[i][k] << std::endl;
The second prints:
100:0
I understand that map has "unique keys", on the other hand, we can init like "_map[i][j]".
Could you please explain me how to initialize a static two dimensional map in a right way?
On the other hand, to initialize a 2D array, you just need two nested loops. 6) In a two dimensional array like int[][] numbers = new int[3][2], there are three rows and two columns. You can also visualize it like a 3 integer arrays of length 2.
it would be:
map<int, map<int, int>> _map = {
    {1, {{2, 100}, {3, 200}}}
  };
You could also have:
_map[1] = {{2, 100}, {3, 200}};
Your snippet
map <int, map<int, int>> _map = {
    {1, {{2, 100}}},
    {1, {{3, 200}}}
  };
would be "equivalent" (initialization versus insertion) to:
_map.insert({1, {{2, 100}}});
_map.insert({1, {{3, 200}}}); // Fails as key 1 already present.
                        The two operations are not equivalent. This:
map <int, map<int, int>> _map;
_map[i][j] = 100;
_map[i][k] = 200;
First creates an entry in your map with key i and returns a reference to a value associated with your key - an std::map<int, int>, which then you apply [j] = 100; to. This means that _map has one element - a key-value pair of {i, {j, 100}}.
Then you apply _map[i][k] = 200;, which retrieves a value under i key (the very same std::map<int, int>) and puts a key-value pair of {k, 200} there. Your _map consists now of: {i, {{j, 100}, {k, 200}}}.
Now, why this doesnt work the same:
map <int, map<int, int>> _map = {
    {1, {{2, 100}}},
    {1, {{3, 200}}}
};
that's because here you introduce two key-value pairs. Twice with a key equal 1 with a value equal to separate maps. This is not equivalent. You would need to change your sytax to the following: 
map<int, map<int, int>> _map = {
    {1, {{2, 100}, {3, 200}}}
};
This, like the first example, creates one entry (a key-value pair) to your map with a key 1 and a value std::map<int, int> consisting of two entries - {2, 100} and {3, 200}.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With