如何覆盖unordered_map的[]运算符

时间:2015-06-07 14:29:43

标签: c++ stl

想要检查unordered_map中是否存在密钥。目前我使用count()成员函数。如果它大于0,则表示密钥存在。

想知道是否可以执行以下操作:

typedef std::unordered_map< long, long > m;
m[100] = 20;
m[1000] = 200;
...
//get user input x as an integer
if (m[x] == 0) {
    //do something
}

上述代码的问题在于,对于不存在的密钥xif (m[x] == 0)会向地图添加一个条目。我需要的是,[]运算符返回默认值(例如&#34; 0&#34;当类型为long,int,如果类型为字符串则为空字符串对象)如果键不是&# 39; t存在(只是不添加条目)。在我的情况下,unordered_map条目的值不为零。不知道如何覆盖这个运营商。有任何想法吗?谢谢。

2 个答案:

答案 0 :(得分:3)

请改用.find()if (map.find(key) != map.end())然后它存在于地图中。否则if (map.find(key) == map.end())它不存在。

答案 1 :(得分:3)

  

我需要的是,[]运算符返回默认值(例如&#34; 0&#34;当类型为long,int,如果类型为字符串则为空字符串对象)如果键不是&# 39;存在(只是不添加条目)

你可以自己编写这样的功能 - 你不需要覆盖任何东西:

template <typename K, typename T, typename H, typename KE, typename A>
T value_or_default(const std::unordered_map<K,T,H,KE,A>& map,
                   const K& key,
                   T def = T{})
{
    auto it = map.find(key);
    return it != map.end() ? it->second : def;
}