如果在映射中没有找到键,则返回其他值

Return other value if key not found in the map

本文关键字:返回 其他 映射 如果      更新时间:2023-10-16

我有unordered map:

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

如果没有关键字i,结果将是0。是否可以返回其他值,例如NULL-MAXINT ?

您可以这样做(不在map中插入值):

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;
}

或者如果map不存在,想要添加值:

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);

结果0不表示"该值未找到"。被发现:[]操作刚刚添加了它。结果是0,因为这是long的默认值,而您的[]操作默认构造了 long。你不能改变long的默认构造方式。

如果您只想查看元素是否已经存在,您应该使用my_map.count(i),它返回10,分别表示"此键存在"answers"此键不存在"。如果该键不存在,则可以使用my_map.insert添加一个键,其值为您喜欢的任何值。

当您使用my_map[i]时,如果该值不存在,则创建它。因此,您可以创建与它的默认构造函数不同的任何东西。或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];