编译器没有完成进程

compiler doesn't finish process

我有一个 multimap,它的键很短,value 是另一个 multimap

std::multimap<short,std::multimap<short,short>> multimap

现在我想做`

std::multimap<short,short> &a=multimap.find(0)->second;
std::pair<short,short> z={1,2};
a.insert(z);

编译正常。但是当我 运行 它只是停止并且没有完成这个过程,它甚至没有抛出任何 运行timeerror。有什么想法吗?谢谢指教。

std::multimap<short,std::multimap<short,short>> multimap
...
std::multimap<short,short> &a=multimap.find(0)->second;
std::pair<short,short> z={1,2};
a.insert(z);

如果 find returns multimap::end 那个不应该被取消引用,但是你这样做并获得了对 second 的引用,以后使用时行为是未定义的对 insert.

的引用

所以当然要检查 find 是否成功,比如

  std::multimap<short,std::multimap<short,short>> multimap;
  std::multimap<short,std::multimap<short,short>>::iterator it = multimap.find(0);

  if (it == multimap.end()) {
    ...
  }
  else {
    std::multimap<short,short> &a = it->second;

    std::pair<short,short> z={1,2};
    a.insert(z);
  }

其中你的标题"compiler doesn't finish process"不是很清楚,执行不是你期望的,但是编译器没有运行过程

如果 multimap 没有键为 0 的项,则 multimap.find(0) return 是一个不可取消引用的迭代器。在取消引用迭代器之前,始终检查此类调用的 return 值。

auto iter = multimap.find(0);
if ( iter != multimap.end() )
{
   std::multimap<short,short> &a = iter->second;
   std::pair<short,short> z={1,2};
   a.insert(z);
}
else
{
   // Decide what to do
}