统计一段词中出现次数最多的高频词(不区分大小写)
思路:用map存储每个词出现的频率(注意为什么不用unordered_map,因为若想实现“不区分大小写”的功能,就必须添加一个自定义比较器,unordered_map不支持这一选项),然后用priority_queue优先级队列的小顶堆特性找到高频词(TOPK问题转换为TOP1)。
(小顶堆求最大TOPK)堆(size = k)里存放的是当前元素的频率,其中堆顶的元素最小。加入新进来的元素,此时若size>k,弹出堆顶元素,调整堆。【大顶堆求最小TOPK类似】
在写自定义比较器的过程中出现bug
错误 C3848 具有类型“const my_less”的表达式会丢失一些 const-volatile 限定符以调用“bool my_less::operator ()(const std::string &,const std::string &)”
解决方案:仿函数后 + const
变成常函数。
原因:重载()(string)不具备const属性(即使添加const属性),应防止调用过程中改变string的值,所以将函数变成常函数。
参考https://blog.csdn.net/weixin_42157432/article/details/108573062
https://blog.csdn.net/qq_37613319/article/details/104360043(也有说Visual Studio的编译器优化的问题 —- 具有指定 const volatile 类型的变量智能调用相同或更大的const volatile限定的成员函数
)
1 |
|
将k改为任意数,则解决TOPK问题。