我正在解决面试实践问题,如下所述:
在实时数据流中查找前k个常用词。
为Topk Class实现三种方法:
--- TopK(k)。构造函数。
---加(字)。添加一个新单词 --- topk()。
获取当前最常用的k个单词。
我编写了以下代码,但无法编译
#include <iostream>
#include <unordered_map>
#include <set>
#include <vector>
using namespace std;
unordered_map<string, int> wordcount;
class TopK {
public:
struct comp {
bool operator()(const string &a, const string &b) {
if (wordcount[a] != wordcount[b]) {
return wordcount[a] > wordcount[b];
}
return a < b;
}
};
set<string, comp> topkWords;
int limit;
TopK(int k) {
// initialize your data structure here
limit = k;
}
void add(string& word) {
// Write your code here
if (wordcount.count(word) == 0) {
wordcount[word] = 1;
} else {
wordcount[word]++;
}
if (topkWords.size() < limit) {
topkWords.insert(word);
} else {
if (topkWords.count(word) == 0) {
string toDel = *(--topkWords.end());
wordcount[toDel]--;
topkWords.erase(--topkWords.end());
topkWords.insert(word);
}
}
}
vector<string> topk() {
// Write your code here
vector<string> res;
for (string i : topkWords) {
res.push_back(i);
if(--limit == 0) {
break;
}
}
return res;
}
};
int main(int argc, const char * argv[]) {
// insert code here...
TopK obj(3);
string s = "leet";
obj.add(s);
s = "code";
obj.add(s);
s = "code";
obj.add(s);
vector<string> res = obj.topk();
for (string s : res) {
cout << s << endl;
}
return 0;
}
出现以下错误:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c ++ / v1 / __ tree:2043:13:没有匹配函数来调用'const value_compare'类型的对象(又名' const TopK :: comp')
如果我在行中添加add()
if (topkWords.count(word) == 0) {
是
if (topkWords.find(word) == topkWords.end()) {
然后一切正常。
所以我猜这与使用count()和find()有关。我检查了cplusplus.com以获取有关这两个功能的信息。它们的返回类型当然是不同的,但它们都使用比较器(在我的代码的struct comp中)来查找与函数参数相等的元素。这是我很困惑的。为什么count()不起作用以及为什么find()运行良好。谁能给我比cplusplus.com更详细的解释。谢谢。
更新。我的comp :: operator()不是const。如果我将const添加到comp :: operator(),count()也可以。我知道使用operator()是必要的,我应该这样做。为什么find()不介意使用非const comp :: operator()?