【问题标题】:Initializing a static two dimensional map<int, int> in C++在 C++ 中初始化静态二维映射<int, int>
【发布时间】:2019-09-11 20:03:25
【问题描述】:

我有二维地图

map <int, map<int, int>> _map;

第一种初始化效果很好:

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; 

这样打印出来:

100:200

但是,第二次初始化失败:

map <int, map<int, int>> _map = {
    {1, {{2, 100}}},
    {1, {{3, 200}}}
  };
  std::cout << _map[i][j] << ":" << _map[i][k] << std::endl;

第二次打印:

100:0

我知道地图有“唯一键”,另一方面,我们可以像“_map[i][j]”一样初始化。

您能否解释一下如何以正确的方式初始化静态二维地图

【问题讨论】:

  • 请注意,当您执行_map[i][k] = 200; 时,您不会初始化_map[i],因为它之前在您执行_map[i][j] = 100; 时已初始化,它只是访问它。 operator[] 如果存在则返回元素,否则将其添加到地图中然后返回。

标签: c++ multidimensional-array stl containers


【解决方案1】:

应该是:

map<int, map<int, int>> _map = {
    {1, {{2, 100}, {3, 200}}}
  };

您还可以:

_map[1] = {{2, 100}, {3, 200}};

你的sn-p

map <int, map<int, int>> _map = {
    {1, {{2, 100}}},
    {1, {{3, 200}}}
  };

将“等效”(初始化与插入):

_map.insert({1, {{2, 100}}});
_map.insert({1, {{3, 200}}}); // Fails as key 1 already present.

【讨论】:

  • 这是正确的,但可以从原始代码为什么不起作用的额外说明中受益。
【解决方案2】:

这两个操作是不等价的。这个:

map <int, map<int, int>> _map;
_map[i][j] = 100;
_map[i][k] = 200;

首先在您的映射中使用键 i 创建一个条目,并返回对与您的键关联的值的引用 - std::map&lt;int, int&gt;,然后您将 [j] = 100; 应用到该值。这意味着 _mapone 元素 - key-value{i, {j, 100}}

然后您应用_map[i][k] = 200;,它检索i 键下的一个值(与std::map&lt;int, int&gt; 完全相同)并在那里放置一个{k, 200} 的键值对。您的_map 现在包括:{i, {{j, 100}, {k, 200}}}

现在,为什么这不起作用:

map <int, map<int, int>> _map = {
    {1, {{2, 100}}},
    {1, {{3, 200}}}
};

那是因为你在这里引入了两个键值对。两次,键等于1,值等于单独的映射。这不是等价的。您需要将您的语法更改为以下内容:

map<int, map<int, int>> _map = {
    {1, {{2, 100}, {3, 200}}}
};

与第一个示例一样,这会为您的映射创建一个条目(键值对),其中一个键 1 和一个值 std::map&lt;int, int&gt; 由两个条目组成 - {2, 100}{3, 200}

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 2015-05-08
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2021-01-31
    • 2011-05-04
    • 2015-09-05
    • 1970-01-01
    相关资源
    最近更新 更多