C++计数地图
C++ Counting Map
最近我正在处理一个我确信是一个非常普遍的问题,它基本上归结为以下内容:
给定一个长文本,计算文本中每个单词出现的频率。
我能够使用std::unordered_map
解决这个问题。然而,这变得非常丑陋,因为文本中的每个单词,如果已经遇到这种情况,我必须进行查找,擦除,然后重新插入到地图中,并增加值。
我意识到还有其他方法可以做到这一点,例如在香草数组/向量之上使用哈希函数并在那里增加值,但我想知道是否有更优雅的方法来解决这个问题,比如 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[]
将为值创建一个条目。关联的值将是指定类型的值初始化对象,如果是int
(或类似值(,则为零。然后,每次遇到这个词时,我们都会增加它。
另一种解决方案:
std::multiset<std::string> m;
for (auto w: words) m.insert(w);
m.count("some word");
优点是你不必依赖operator[]
的"技巧",使代码更具可读性。
编辑:正如Kerrek在评论中指出的那样,这种解决方案较慢。 multiset
存储您插入的所有元素,即使它们被视为相等(它们在某些方面可能仍然不同,operator==
不会检查(。与unordered_map<std::string, int>
相比,这会导致大量的开销,因为只需要存储每个单词一次。
(作为旁注,使用映射解决方案处理威廉·莎士比亚的全部作品在我的机器上大约需要 0.33 秒,而多集解决方案需要 0.78 秒。
- 为什么不;名字在地图上是按顺序排列的吗
- 基于多个条件处理地图中的所有元素
- 在C++中将矢量转换为嵌套地图
- 替换基于地图的所有引用
- 如何区分地图中的 0 和 false?
- 地图计数确实很重要,或者只是检查是否存在
- 如何从地图中删除矢量对象
- 是否有任何C++功能可以对地图进行排序?
- 如何使用 std::variant 打印地图键/值?
- 从矢量或地图中删除共享指针
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 无限嵌套具有变体的地图
- C++一会儿循环读到地图上 2 行?
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 如何检查变量是否是C++中的地图?
- 如何使地图按值C++排序
- 修改地图内矢量中的值
- 为什么我在地图中搜索STL时差很大?
- 我正在尝试按降序对地图进行排序,但没有得到预期的结果?
- 如何包装(撰写)增强 hana 地图并访问括号运算符(运算符 [])?