编译器没有完成进程
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
}
我有一个 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
}