如果在地图中找不到钥匙,则返回其他值

时间:2016-10-20 16:26:01

标签: c++ unordered-map

我有unordered map

static unordered_map<int, long> my_map;
auto& result = my_map[i];

如果没有密钥i,则结果为0。 是否可以返回其他值,例如NULL-MAXINT

3 个答案:

答案 0 :(得分:4)

你可以做类似的事情(不在地图中插入值):

template <typename Key, typename Value>
Value& get_or(std::unordered_map<Key, Value>& m, const Key& key, Value& default_value)
{
    auto it = m.find(key);
    if (it == m.end()) {
        return default_value;
    }
    return it->second;
}

或者,如果您想在地图中添加值(如果不存在):

template <typename Key, typename Value, typename T>
Value& get_or(std::unordered_map<Key, Value>& m, const Key& key, T&& default_value)
{
    return m.emplace(key, std::forward<T>(default_value)).first->second;
}

并使用它

int default_value = 42;
auto& result = get_or(my_map, i, default_value);

答案 1 :(得分:2)

结果print int(round(25*(1+16.0/100))) 并不代表&#34;未找到值&#34;。找到值 0操作刚刚添加了它。结果为[],因为这是0的默认值,而long操作默认构建 []。并且您无法更改long的默认构造方式。

如果您想查看该元素是否已存在,您应该使用my_map.count(i),它会返回long1,这意味着&#34;此密钥存在&#34;和&#34;此密钥不存在&#34;分别。如果该密钥不存在,您可以使用my_map.insert添加一个您喜欢的值。

答案 2 :(得分:2)

当您使用my_map[i]时,如果该值不存在,则会创建该值。所以你可以创建与ts默认构造函数不同的东西。或者long的默认值。你有几个选择:

如果值不存在,请将值设置为您想要的值:

if (my_map.find(i) == my_map.end()) {
    my_map[i] = MAX_INT; //Or whatever you want.
}

或者使用默认构造函数为long创建自己的包装类:

struct DefLong {
  long myLong;
  long& operator() {
      return myLong;
  }
  DefLong () : myLong(MAX_INT){}
}
....
static unordered_map<int, DefLong> my_map;
auto& result = my_map[i];
long otheresult = my_map[i];