即使没有指定自定义比较器,对<int,int>的优先级队列如何工作?

时间:2017-08-31 21:54:06

标签: c++ vector priority-queue std-pair

std::vector使用std::vector<pair<int, int>>作为默认容器(参考this)。为了根据k中的第一个元素进行排序,我们需要定义自己的比较函数(参考this)。这就是我的理解。

现在,以下代码在O(NlogK)中返回非空数组中最常见的class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { if(nums.empty()) return vector<int>(); unordered_map< int, int > hashMap; for(int i=0; i<nums.size(); i++) hashMap[nums[i]]++; priority_queue< pair< int, int >> pq; vector< int > result; unordered_map< int, int >::iterator it=hashMap.begin(); for(it=hashMap.begin(); it!=hashMap.end(); it++) { //the first one is frequency and the second one is the value pq.push(make_pair(it->second, it->first)); //the peculiar implementation below is because we the code to be O(NlogK) if(pq.size()>(hashMap.size()-k)) { result.push_back(pq.top().second); pq.pop(); } } return result; } }; 元素:

std::priority_queue

此代码正常运行并被法官接受 - 但如何?使用std::vector<pair<int, int>>作为其基础容器的{{1}}必须包含自定义比较函数,以便正确排序。那么,它是如何运作的?

1 个答案:

答案 0 :(得分:1)

坦率地说,它之所以有效,是因为它的设计目的。

一些事情:

  • std::priority_queue使用std::less<T>,其中T是基础序列值类型,作为未指定覆盖时的默认比较器。
  • std::less<T>针对两个operator <参数调用T,解析为最适合和/或可用的任何参数。

因此,如果这可以按照您的意愿工作而没有特殊的序列类型比较器覆盖,那么它必须意味着operator <存在std::pair<int,int>,将整个事物连接在一起。

确实有。检查std::pair<T1,T2>的文档,您会发现operator <重载有效地执行此操作:

if (lhs.first < rhs.first)
    return true;
else if (!(rhs.first < lhs.first))
    return lhs.second < rhs.second
else
    return false;

有关其如何运作的精神播放示例留待读者思考。