我怎样才能避免在 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
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 值作为错误处理。但是,不应将异常用于预期的情况。这取决于您的设置。
我在下面有这个函数,wordcount_map 是 std::unordered_map
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
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 值作为错误处理。但是,不应将异常用于预期的情况。这取决于您的设置。