如何解决引发'std :: out_of_range'实例后调用终止吗?
我试图查看map
中是否存在特定的密钥,如果存在,那么我想将其值增加1。但是在运行程序时出现错误
抛出'std :: out_of_range'实例后调用terminate what():map :: at
为什么会out_of_range
,有人可以帮忙吗?
b是此功能中的地图。 itr是用于访问其元素的迭代器
for(int i=0;i<n;i++)
{
ct=0;
cin>>a[i];
for(itr=b.begin();itr!=b.end();itr++)
{
if(itr->first==a[i])
ct++;
else
continue;
}
if(!ct)
{
b.at(a[i])++;
}
else
{
b.insert(pair <int,int>(a[i],1));
}
}
}
解决方法
您可以只用3-4行就可以写出整个内容:
for (int i = 0; i < n; ++i) {
cin >> a[i];
++b[a[i]];
}
如果在地图{a[i],0}
中没有a[i]
作为密钥,subscript operator将自动插入b
。然后增加它使其等效于您尝试插入一对{a[i],1}
的代码。
您的方法出了什么问题:
您在执行b.at(a[i])++
之前使用的条件是错误的。应该是if (ct)
而不是if (!ct)
。
[改进]
您本可以在发现break
为真的情况下投入itr->first == a[i]
。但仍然是时间O(n)
。这违背了使用std::map
而不是std::vector<std::pair<int,int>>
的目的。如果改用std::map::find
,则可以对数时间复杂度执行该操作。 (更多方法here。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。