这是我正在使用的无序地图的MWE。根据我的理解here,公共成员函数“erase”用于擦除无序映射中的元素。
#include <iostream>
#include <string>
#include <algorithm>
#include <unordered_map>
using namespace std;
int main() {
std::unordered_map<int, std::pair<int, int> > m;
m.insert({3, std::make_pair(1,1)});
m.insert({4, std::make_pair(5,1)});
cout << m[4].first << endl;
m.erase(4);
cout << m[4].first << endl;
}
但是,我从这个例子中看到的内容如下:
5
0
我只期待5
,然后抛出一个错误,指出密钥不存在。
我错过了什么?
答案 0 :(得分:4)
正如documentation中所指出的,如果unordered_map
中不存在值,operator[]
将引入带有相应键的新元素。您在第二个查询中得到的是默认构造的对,由operator[]
构建。
正如@you在他的评论中指出的那样,您可以使用包含“范围”检查的at()
,如果密钥现在位于std::out_of_range
,则会引发unordered_map
异常。
如果你想避免这种异常,你可以先检查m.find(4)==m.end()
是否表示钥匙4不在地图中,正如@YSC在评论中指出的那样。