用map-values初始化一个映射

Initialize a map with map-values

本文关键字:一个 映射 map-values 初始化      更新时间:2023-10-16

我想用map -values初始化map:

std::map<int, std::map<int, int>> map =
{
    { 1, { { 1, 0 }, { 2, 1 } } },
    { 2, { { 1, 1 }, { 2, 0 } } },
};

虽然编译时没有任何错误或警告,但它会引发一个异常,指出"map/set iterators incompatible"。如果我删除第二对,即{ 2, { { 1, 1 }, { 2, 0 } } },则不会引发异常,并且map包含密钥为1的一对和包含(1, 0)(2, 1)对作为其值的映射。

我相信这种(乍一看)奇怪的行为一定有很好的原因。


解决方案

不,没有很好的理由。原来这是Visual Studio 2013中一个漂亮的bug。

你试过c++11选项吗?

#include <iostream>
#include <map>
int main()
{
  std::map<int, std::map<int, int>> map =
    {
      { 1, { { 1, 0 }, { 2, 1 } } },
      { 2, { { 1, 1 }, { 2, 0 } } },
    };
  auto t = map[1];
  std::cout << t[1] << std::endl;
  std::cout << t[2] << std::endl;
  auto t2 = map[2];
  std::cout << t2[1] << std::endl;
  std::cout << t2[2] << std::endl;
  std::cout << "--------------" << std::endl;
  std::cout << map[1][1] << std::endl;
  std::cout << map[1][2] << std::endl;
  std::cout << map[2][1] << std::endl;
  std::cout << map[2][2] << std::endl;
}