使用3个元素从无序映射中删除值

时间:2018-03-27 07:58:04

标签: c++ unordered-map

这是我正在使用的无序地图的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,然后抛出一个错误,指出密钥不存在。

我错过了什么?

1 个答案:

答案 0 :(得分:4)

正如documentation中所指出的,如果unordered_map中不存在值,operator[]将引入带有相应键的新元素。您在第二个查询中得到的是默认构造的对,由operator[]构建。

正如@you在他的评论中指出的那样,您可以使用包含“范围”检查的at(),如果密钥现在位于std::out_of_range,则会引发unordered_map异常。

如果你想避免这种异常,你可以先检查m.find(4)==m.end()是否表示钥匙4不在地图中,正如@YSC在评论中指出的那样。