我怎样才能避免在 C++ 中对 const unordered_map 使用“[]”运算符?

How can I get around from using "[]" operator on const unordered_map in C++?

我在下面有这个函数,wordcount_map 是 std::unordered_map 类型。我正在使用 count 函数来查看键是否在地图中,以及是否 return 存储在该键中的值。但是,我收到一个错误,因为 map 被标记为 const 并且 [] 运算符是不允许的。请指教!

int lookupWithFallback(const StringIntMap& wordcount_map, const std::string& key, int fallbackVal) {

  if (wordcount_map.count(key)){
    return wordcount_map[key];
  }
  else {
    return fallbackVal;
  }
}

使用 const 方法“find”: https://en.cppreference.com/w/cpp/container/unordered_map/find

在你的情况下,类似于:

int lookupWithFallback(const StringIntMap& wordcount_map, const std::string& key, int fallbackVal) {
     auto it = wordcount_map.find(key);
     if(it != wordcount_map.end())
        return it->second;
     else
       return fallbackVal;
}

运算符 [] 不是 const,因为如果键不存在,它将被创建。 https://en.cppreference.com/w/cpp/container/unordered_map/operator_at

使用find member function:

int lookupWithFallback(const StringIntMap& wordcount_map, 
                       const std::string& key, 
                       int fallbackVal) 
{
    auto it = wordcount_map.find(key);
    return it != wordcount_map.end() ? it->second : fallbackVal; 
}

此方法也只会执行一次查找,即使在您确实要修改地图时也很有用。

即使如果你的地图是non-const,你的算法也需要冗余查找。

您可以按照其他答案中的建议使用 std::unordered_map::find

int lookupWithFallback(const StringIntMap& wordcount_map, const std::string& key, int fallbackVal) {
    if (auto const it = wordcount_map.find(key); it != wordcount_map.end()) {
      return it->second;
    } else {
      return fallbackVal;
    }
}

或者您可以使用 std::unordered_map::at 并捕获异常而不是传递 fallbackVal:

try {
  return wordcount_map.at(key);
} catch (std::out_of_range const& oor) {
  /* handle error in a sensible way or: */
  return fallbackVal;
}

对于比 int 更复杂的类型,传递默认值是一个问题,因此您可能需要考虑将 non-existent 值作为错误处理。但是,不应将异常用于预期的情况。这取决于您的设置。