C++优先级队列中的多次比较?

C++优先级队列中的多次比较?

什么是优先级队列?

优先级队列是类似队列的抽象数据类型,每个元素都有与之关联的某些优先级值。优先级队列中元素的优先级决定了元素被服从的顺序(即它们被取出的顺序)。如果在任何情况下,元素具有相同的优先级,则按照它们在队列中的排序顺序服务。

C++中的priority_queue STL是什么?

priority_queue ”是一个容器适配器,它提供了常数时间查找最大元素,代价是对数插入和提取。我们可以使用自定义的比较函数来改变顺序,例如使用 **std :: greater ** 会导致最小的元素显示在队列的顶部。

当我们使用优先级队列时,我们基本上在某些随机访问容器中使用堆,这样做的好处是不会意外地使给定堆无效。

使用自定义比较器的优先级队列

自定义比较器是用于定义将对给定容器进行排序的参数的静态函数。它确定所给容器要排序的方式。

如果我们使用 ‘>’ 符号,则尝试按升序排序,否则将按降序排序,如“ ** > ** ”将在满足 a > b ** ( **a 大于 b )时返回true,否则将返回false。因此,如果比较器将返回true,则会进行交换,否则不会进行交换。

让我们看一个程序,进一步了解如何应用此概念。

#include <bits/stdc++.h>
using namespace std;

// This template is used to print
// the given heap again and again
// irrespective of the given data type
template <class T>
void printQueue(T& q)
{
    while (q.empty() == false) {
        cout << q.top() << " ";
        q.pop();
    }
    cout << endl;
}

// Here we are using a basic priority queue
// and sorting the queue in ascending order
void samplepriorityqueue()
{
    priority_queue<int, vector<int>, greater<int> > pq;
    for (int i = 0; i < 10; i++) {
        pq.push(i);
    }
    printQueue(pq);
}

// Here we are using the lambda comparator function
// to sort given priority queue in ascending order
void samplepriorityqueue1()
{
    auto compare = [](int left, int right) {
        return left < right;
    };
    priority_queue<int, vector<int>, decltype(compare)> pq(
        compare);
    for (int i = 0; i < 10; i++) {
        pq.push(i);
    }
    printQueue(pq);
}

// Here we are using a comparator function
// to sort the given priority queue.
// This comparator function can be extended
// to included several other features
struct mycmp {
    bool operator()(int a, int b)
    {
        return a > b;
    }
};

void samplepriorityqueue2()
{
    priority_queue<int, vector<int>, mycmp> pq;
    for (int i = 0; i < 10; i++) {
        pq.push(i);
    }
    printQueue(pq);
}

// Driver code
int main()
{
    samplepriorityqueue();
    samplepriorityqueue1();
    samplepriorityqueue2();
    return 0;
}

输出:

0 1 2 3 4 5 6 7 8 9 
9 8 7 6 5 4 3 2 1 0 
0 1 2 3 4 5 6 7 8 9 

在这里,我们看到了比较器如何用于比较定义的数据类型,并根据我们给定的比较器对数据进行排序。

C++优先队列中的多重比较

接下来,我们将使用优先队列对用户定义的数据类型进行多重比较,并对已给出的数据进行排序。

我们可以构建一个比较函数,比较多个参数,并根据比较函数中提供的条件对数据结构进行排序。下面是C++优先队列中多个比较的实现。

# include <bits/stdc++.h>
using namespace std;
 
// 用户定义的数据结构的结构
struct jobs {
public:
    int priority;
    int processing;
    int arrivaltime;
    int proccessing_time;
    string job;
    jobs(int priority1, int processing1, int arrivaltime1,
         int proccessing_time1, string s1)
    {
        this->priority = priority1;
        this->processing = processing1;
        this->arrivaltime = arrivaltime1;
        this->proccessing_time = proccessing_time1;
        this->job = s1;
    }
};
 
// 如果优先级相同且我们正在按升序排序,则我们按降序排序。
// 否则,我们按照给定任务的优先级按升序排序
struct compare {
    bool operator()(jobs a, jobs b)
    {
        if (a.priority == b.priority) {
            return a.processing < b.processing;
        }
        return a.priority > b.priority;
    }
};
 
// 驱动程序
int main()
{
    priority_queue<jobs, vector<jobs>, compare> pq;
    for (int i = 0; i < 10; i++) {
        jobs a(rand() % 11, i + 1, rand() % 3 + i,
               rand() % 5 + 3, "something" + to_string(i));
        pq.push(a);
    }
 
    while (pq.empty() == false) {
        jobs b = pq.top();
        pq.pop();
        cout << b.priority << " " << b.processing << " "
             << b.arrivaltime << " " << b.proccessing_time
             << " " << b.job << endl;
    }
    return 0;
}

输出

0 9 10 5 something8
0 8 7 6 something7
3 3 2 4 something2
4 2 3 3 something1
6 1 1 6 something0
7 5 5 3 something4
7 4 5 4 something3
10 10 10 6 something9
10 7 7 5 something6
10 6 5 4 something5

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 教程