C++中sort()函数和priority_queue容器中比较函数的区别详析
作者:魏天乐大帅哥
C++中sort()和priority_queue都能自定义比较函数,其中sort()自定义的比较函数比较好理解,priority_queue中自定义的比较函数的效果和sort()是相反的,这篇文章主要给大家介绍了关于C++中sort()函数和priority_queue容器中比较函数的区别的相关资料,需要的朋友可以参考下
前言
- 普通的queue是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。
- priority_queue中元素被赋予优先级。在创建的时候根据优先级进行了按照从大到小或者从小到大进行了自动排列(大顶堆or小顶堆)。可以以O(log n) 的效率查找一个队列中的最大值或者最小值;
虽然两者第三个参数默认的都是less,但两者参数比较函数的区别是相反的:
小细节 sort中需要传对象,得less(),priority_queue中需要传类型less即可;
less情况
#include<iostream> #include<vector> #include<queue> using namespace std; int main() { vector<int>arr2 = {3,2,1}; sort(arr2.begin(),arr2.end(),less<int>()); //输出sort()之后的vector for (int i = 0; i < 3; i++) { cout << arr2[i] << ' '; } cout << endl; priority_queue<int,vector<int>,less<int>>arr; arr.push(3); arr.push(2); arr.push(1); //输出priority_queue while (!arr.empty()) { cout<<arr.top()<<' '; arr.pop(); } cout << endl; return 0; }
运行结果
则:
- sort()排序是从小到大,即less是升序;
- priority_queue是大顶堆,输出之后是从大到小,即降序;
greater情况
#include<iostream> #include<vector> #include<queue> using namespace std; int main() { vector<int>arr2 = {3,2,1}; sort(arr2.begin(),arr2.end(),greater<int>()); //输出sort()之后的vector for (int i = 0; i < 3; i++) { cout << arr2[i] << ' '; } cout << endl; priority_queue<int,vector<int>, greater<int>>arr; arr.push(3); arr.push(2); arr.push(1); //输出priority_queue while (!arr.empty()) { cout<<arr.top()<<' '; arr.pop(); } cout << endl; return 0; }
运行结果:
则:
sort()排序是从大到小,即greater是降序;
priority_queue是小顶堆,输出之后是从小到大,即升序;
自定义比较函数情况
struct cmp1 //等价于less的内部构造,效果和上面分析的less情况一样 { opeartor()(data x1,data x2){ return x1<x2; } }; struct cmp2 //等价于less的内部构造,效果和上面分析的greater情况一样 { opeartor()(data x1,data x2){ return x1>x2; } };
总结
当比较函数是x1.data<x2.data时: 等价于less
- sort()最终会把序列处理成升序
- priority_queue会处理成大根堆–>遍历输出为降序结构;
当比较函数是x1.data>x2.data时:等价于greater
- sort()最终会把序列处理成降序
- priority_queue会处理成小根堆–>遍历输出为升序结构;
他俩是反着的
到此这篇关于C++中sort()函数和priority_queue容器中比较函数的区别的文章就介绍到这了,更多相关C++比较函数的区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!