优先队列( priority

优先队列( priority,第1张

优先队列( priority

参考文章(31条消息) c++优先队列(priority_queue)用法详解_吕白_的博客-CSDN博客_c++优先队列

 1、sort排序 1、1sort排序的本质(伪)

sort(地址,地址,排序bool函数),导入的前两个参数是地址

所以简便的对于数组,有写法如下:

int arr[10];
sort(arr,arr+10);
1、2自定义的排序

 降序

bool compare(int a,int b) {//必须是bool返回值类型,否则无效
    return a>b;
}

升序反之即可。

个人理解,比较符的方向即代表排序序列的升降 (方便记忆)

1、3实 ***
#include 
#include
using namespace std;
bool compare(int a,int b) {//必须是bool返回值类型
    return a>b;
}

int main()
{
    int arr[10];
    for (int i = 0; i < 10; ++i) {
        arr[i] = 10-i;
    }
    sort(arr, arr + 10,compare);
    for (int i = 0; i < 10; ++i) {
        cout << arr[i] << " ";
    }
    cout << endl;

}

细节:对于自定义数据类型,必须自定义排序方式,(很好理解,即sort不认识自定义数据类型,没有默认的排序方式)

 2、优先队列

  参考文章(31条消息) c++优先队列(priority_queue)用法详解_吕白_的博客-CSDN博客_c++优先队列

 2、1优先队列的本质

本质上是堆实现,支持大部分的队列 *** 作

2、2优先队列的自定义排序

默认是大顶堆,即降序

可以自己调整如下:

//升序队列
priority_queue ,greater > q;
//降序队列
priority_queue ,less >q;

//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

对于自定义数据类型,则必须明白priority_queue 的参数列表(感兴趣的可以看此数据结构的原代码)

priority_queue
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆

对于自定义的数据类型同sort,必须定义排序Functional,并且细节的,Functional需要为数据类型,如:(此为方法二,法一见2、3)

struct tmp2 //重写仿函数
{
    bool operator() (tmp1 a, tmp1 b)
    {
        return a.x < b.x; //大顶堆,降序
    }
};
 2、3实 ***
struct tmp1 //运算符重载<
{
    int x;
    tmp1(int a) { x = a; }
    bool operator<(const tmp1& a) const//没有默认操作,所以必须重载,
    {
        return x > a.x; //大顶堆
    }
};

//方法2
struct tmp2 //重写仿函数
{
    bool operator() (tmp1 a, tmp1 b)
    {
        return a.x > b.x; //大顶堆,降序
        //return 
    }
};

int main()
{
    tmp1 a(1);
    tmp1 b(2);
    tmp1 c(3);
    priority_queue d;
    d.push(b);
    d.push(c);
    d.push(a);
    while (!d.empty())//默认——大顶堆,降序
    {
        cout << d.top().x << 'n';
        d.pop();
    }
    cout << endl;



    priority_queue, tmp2> f;
    f.push(c);
    f.push(b);
    f.push(a);
    while (!f.empty())
    {
        cout << f.top().x << 'n';
        f.pop();
    }
}
3、比较自定义排序(sort与优先队列)

 浅显的:(本篇文章最想表达的东西)

sort函数:升序,a

优先队列:升序,a.x>b.x

深层的:(先挖坑,我也还在学习)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5610930.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存