我正在尝试查看map
中是否存在特定的键,如果存在,则我希望将其值增加1。但是在运行程序时,我得到了错误
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
,则可以在对数时间复杂度中执行该操作。(此处提供更多方法。(