是否有更惯用的方法来“插入或累积”到表示项目计数的 unordered_map 中?

jwe*_*rek 1 c++ unordered-map c++11

考虑如下代码:

#include <iostream>
#include <unordered_map>

std::unordered_map<char, int> get_letter_frequencies(const std::string& str) {
    std::unordered_map<char, int> freqs;
    for (char ch : str) {
        auto iter = freqs.find(ch);
        if (iter == freqs.end()) {
            freqs[ch] = 1;
        } else {
            iter->second++;
        }
    }
    return freqs;
}

int main()
{
    std::string str = "AABBDBCABDA";
    auto freqs = get_letter_frequencies(str);
    std::cout << freqs['B'] << "\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它存储 unordered_map 中的字母计数。我的问题是有一段简洁/更惯用的代码可以用来替换

auto iter = freqs.find(ch);
if (iter == freqs.end()) {
    freqs[ch] = 1;
} else {
    iter->second++;
}
Run Code Online (Sandbox Code Playgroud)

我可以编写一个函数insert_or_accumulate( ... ),但这似乎有点矫枉过正。

Sha*_*ger 5

做就是了:

for (char ch : str) {
    ++freqs[ch];
}
Run Code Online (Sandbox Code Playgroud)

如果缺少,只需访问freqs[ch]即可创建键值对,使用默认构造函数(对于int,生成0),并返回对该值(新的或现有的)的引用,因此++freqs[ch]将增加现有值,并且创建和增加缺失值。

注意:我++优先使用前缀;这里并不重要,因为我们正在增加一个基本的内置类型,但在 C++ 中,您希望养成默认使用前缀增量的习惯,因为重载增量的类不能像前缀增量一样有效地实现后缀增量(后缀增量)需要制作实例的副本,前缀可以在没有副本的情况下就地操作)。

  • 请参阅 [`operator[]`](https://en.cppreference.com/w/cpp/container/unordered_map/operator_at) 的文档:“_...映射的值是[值初始化](https: //en.cppreference.com/w/cpp/language/value_initialization)_"。 (3认同)
  • 不,本地“int i;”仍未初始化。然而,本地 `int i{};` 是值初始化的(清零)。 (3认同)