C++中sort()函数和priority_queue容器中比较函数的区别详析

 更新时间:2023年03月07日 10:33:42   作者:魏天乐大帅哥  
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++比较函数的区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言学生信息管理系统设计与实现

    C语言学生信息管理系统设计与实现

    这篇文章主要为大家详细介绍了C语言学生信息管理系统设计与实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++ sqlite3数据库配置使用教程

    C++ sqlite3数据库配置使用教程

    SQLite 是一种嵌入式的关系型数据库管理系统,它是一个开源项目,已经被广泛应用于各种应用程序和操作系统中,这篇文章主要介绍了C++ sqlite3数据库配置使用,需要的朋友可以参考下
    2023-08-08
  • wince程序防止创建多个实例实现互斥作用

    wince程序防止创建多个实例实现互斥作用

    什么时候用的互斥?当你的程序只允许同时打开一个的时候,就可以通过互斥来实现,下面说的互斥,主要是针对防止程序创建多个实例这种情况来实现的
    2014-02-02
  • 用c 获取文件MD5值的实现方法

    用c 获取文件MD5值的实现方法

    本篇文章是对用c语言获取文件MD5值的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++继承类成员访问权限修饰符详解

    C++继承类成员访问权限修饰符详解

    这篇文章主要为大家介绍了C++继承类成员访问权限修饰符,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • C++优先队列用法案例详解

    C++优先队列用法案例详解

    这篇文章主要介绍了C++优先队列用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++中cout的格式使用详细介绍

    C++中cout的格式使用详细介绍

    cout 是C++中 ostream 类型的对象,该类被封装在 < iostream > 库中,该库定义的名字都在命名空间 std 中,所以 cout 全称是 std::cout 。本文重点给大家介绍C++中cout的格式使用,需要的朋友参考下吧
    2021-06-06
  • 使用udp发送>=128K的消息会报ENOBUFS的错误的解决方法

    使用udp发送>=128K的消息会报ENOBUFS的错误的解决方法

    在项目中选择了unix域的数据报套接口。在使用过程中碰到了如下,问题:发送<128K的消息时,客户、进程可以正常收发消息;发送>=128K的消息时,发送端(sendto)返回ENOBUFS的错误。下面小编来详细说下
    2019-05-05
  • C++中 STL list详解及简单实例

    C++中 STL list详解及简单实例

    这篇文章主要介绍了C++中 STL list详解及简单实例的相关资料,需要的朋友可以参考下
    2017-04-04
  • C语言数据结构之队列的定义与实现

    C语言数据结构之队列的定义与实现

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(head)进行删除操作,而在表的后端(tail)进行插入操作。本文将详细讲讲C语言中队列的定义与实现,感兴趣的可以了解一下
    2022-07-07

最新评论