![](/img/trans.png)
[英]terminate called after throwing an instance of 'std::out_of_range'
[英]terminate called after throwing an instance of 'std::out_of_range'?
我試圖查看map
是否存在特定鍵,如果存在,那么我想將其值增加 1。但是在運行程序時我收到錯誤
在拋出 'std::out_of_range' 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]
不存在作為映射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
代替,則可以以對數時間復雜度執行該操作。 ( 這里有更多方法。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.