在抛出"std::out_of_range"实例后终止调用?



我正在尝试查看map中是否存在特定的键,如果存在,则我希望将其值增加1。但是在运行程序时,我得到了错误

抛出"std::out_of_range"的实例后调用的

terminatewhat((:映射::在

为什么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]不是映射b中的关键字,则下标运算符将自动插入{a[i], 0}。然后将其递增,使其等效于您尝试插入一对{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,则可以在对数时间复杂度中执行该操作。(此处提供更多方法。(

最新更新