优先队列出队的是当前优先级最高的元素,我们要做的是把出现次数多的留下,所以比较器要以次数少为优先级高,其逻辑与默认的less行为相反

    vector<vector<string> > topKstrings(vector<string>& strings, int k) {
        // write code here
        vector<vector<string> > ans;
        if (strings.empty() || strings.size() < k)
            return ans;
        // 记录每个元素出现的次数
        unordered_map<string, int> map;
        for (const auto& string : strings) {
            ++map[string];
        }
        // 按照出现次数排序,次数相同按照字典序
        auto cmp = [](const pair<string, int>& p1, const pair<string, int> p2) {
            return p1.second==p2.second?p1.first<p2.first:p1.second>p2.second;
        };
        // 将全部元素入堆
        priority_queue<pair<string, int>, vector<pair<string, int>>, decltype(cmp)> min_heap(cmp);
 
        for ( const auto& pair: map) {
            min_heap.emplace(pair);
            if (min_heap.size() > k)
                min_heap.pop();
        }
         ans.reserve(k);
         //出队时是按照出现次数从低到高,因此需要之后reverse
         while(!min_heap.empty()) {
            auto p = min_heap.top();
            //数组不要向begin()位置插入元素,应该插入到end()位置
            ans.emplace_back(vector<string>{p.first,to_string(p.second)});
            min_heap.pop();
         }
         reverse(ans.begin(),ans.end());
         return ans;
    }