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( ... ),但这似乎有点矫枉过正。
做就是了:
for (char ch : str) {
++freqs[ch];
}
Run Code Online (Sandbox Code Playgroud)
如果缺少,只需访问freqs[ch]即可创建键值对,使用默认构造函数(对于int,生成0),并返回对该值(新的或现有的)的引用,因此++freqs[ch]将增加现有值,并且创建和增加缺失值。
注意:我++优先使用前缀;这里并不重要,因为我们正在增加一个基本的内置类型,但在 C++ 中,您希望养成默认使用前缀增量的习惯,因为重载增量的类不能像前缀增量一样有效地实现后缀增量(后缀增量)需要制作实例的副本,前缀可以在没有副本的情况下就地操作)。