最近我正在处理一个我确信是非常普遍的问题,它基本上可以归结为以下几点:
给定一个长文本,计算每个单词在文本中出现的频率。
我能够使用 std::unordered_map
解决这个问题。然而,这变得非常难看,对于文本中的每个单词,如果已经遇到过,我必须进行查找、删除,然后重新插入 map 并增加值。
我意识到还有其他方法可以做到这一点,例如在普通数组/vector 之上使用散列函数并在那里递增值,但我想知道是否有更优雅的方法来解决这个问题,比如STL 组件或函数。这将具有与 Pythons Counter 集合类似的界面。
我知道 C++ 就是 C++ 我真的不能指望总是为我实现如此高层次的概念,但我只是想知道你们是否对任何新事物(或者至少你们的谷歌搜索技能优于我的)可以使我的代码更好一些。
最佳答案
我不太确定为什么 std::unordered_map
(或只是 std::map
)会涉及很多复杂性。我会写这样的代码:
std::unordered_map<std::string, int> words;
std::string word;
while (word = getword(input))
++words[word];
不需要任何类型的查找/删除/重新插入。
如果不清楚它是如何/为什么工作的:operator[]
将为一个值创建一个条目(如果 map 中不存在)。关联值将是指定类型的值初始化对象,在 int
(或类似)的情况下将为零。然后我们每次遇到这个词时都会增加它。
关于C++ 计数图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33975810/