考慮如下代碼:
#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;
}
它將字母計數存盤在 unordered_map 中。我的問題是有一個更簡潔/更慣用的代碼片段,我可以用它來替換
auto iter = freqs.find(ch);
if (iter == freqs.end()) {
freqs[ch] = 1;
} else {
iter->second ;
}
我可以寫一個函式,insert_or_accumulate( ... )但它似乎有點矯枉過正。
uj5u.com熱心網友回復:
做就是了:
for (char ch : str) {
freqs[ch];
}
freqs[ch]如果缺少,僅訪問將創建鍵值對,使用默認建構式(for int,that make 0),并回傳對值的參考(新的或現有的),因此 freqs[ch]將增加現有值,并且創建和增加缺失值.
注意:我 按偏好使用前綴;這里無關緊要,因為我們遞增的是原始內置型別,但是在 C 中,您希望養成默認使用前綴遞增的習慣,因為多載 increment 的類無法像實作前綴遞增 (postfix需要制作實體的副本,前綴可以在沒有副本的情況下進行操作)。
uj5u.com熱心網友回復:
std::unordered_map考慮到動態分配和散列的數量,使用 a本身有點矯枉過正。當然,迭代非零元素既快速又容易,但計算字符數的更簡單方法是使用包含 256 個值的簡單陣列。
陣列更簡單,而且很可能更快,代價是如果您想這樣做,可能會更麻煩地迭代專案。然而,考慮到會發生的間接性unordered_map,我個人仍然更喜歡這種方法而不是其他方法。也是訂的。
int freqs[256] = {};
for (unsigned char c : str) freqs[ch];
作為回傳值的函式的插件,您可以使用std::array.
#include <array>
#include <string>
#include <iostream>
typedef std::array<int, 256> CharFreqType;
CharFreqType get_letter_frequencies(const std::string& str)
{
CharFreqType freqs{};
for (unsigned char c : str) freqs[c];
return freqs;
}
int main()
{
auto freqs = get_letter_frequencies("AABBDBCABDA");
std::cout << freqs['B'] << "\n";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/385117.html
