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