在C ++容器中使用find()与count()

时间:2016-12-03 16:35:08

标签: c++ count find

我正在解决面试实践问题,如下所述:

  

在实时数据流中查找前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()?

0 个答案:

没有答案