Множественные сравнения в очереди приоритетов С++?

Как преобразовать строку в int в C++ Программирование и разработка

Priority Queue — это абстрактный тип данных, похожий на очередь, и каждый элемент имеет связанное с ним значение приоритета. Приоритет элементов в очереди приоритетов определяет порядок обслуживания элементов (т. е. порядок их удаления). Если в любом случае элементы имеют одинаковый приоритет, они обслуживаются в соответствии с их порядком в очереди.

Что такое priority_queue STL в C++?

» Priority_queue » — это адаптер контейнера, который обеспечивает поиск самого большого элемента в постоянное время за счет логарифмической вставки и извлечения. Мы можем использовать предоставленную пользователем функцию сравнения, чтобы изменить порядок, например, использование std::greater приведет к тому, что наименьший элемент появится вверху.

Когда мы используем приоритетную очередь, мы в основном используем кучу в каком-то контейнере с произвольным доступом, преимущество которого заключается в том, что мы не можем случайно сделать данную кучу недействительной.

Приоритетная очередь с пользовательским компаратором

Пользовательские компараторы — это статические функции, которые используются для определения параметра, по которому будет сортироваться данный контейнер. Он определяет способ сортировки данного контейнера.

Если мы используем символ «>», то мы пытаемся отсортировать в порядке возрастания, иначе мы пытаемся отсортировать в порядке убывания, поскольку » > » вернет true, когда a> b ( a больше, чем b ), иначе он вернет ЛОЖЬ. Таким образом, обмен произойдет, если компаратор вернет значение 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

Здесь мы видим, как компаратор используется для сравнения определенных типов данных и сортировки данных в соответствии с заданным нами компаратором.

Читайте также:  Как переименовать файл в Python

Множественные сравнения в очереди приоритетов C++

Затем мы собираемся сделать несколько сравнений, используя очередь приоритетов для определенного пользователем типа данных, а затем мы собираемся отсортировать данные, которые были нам предоставлены.

Мы можем создать функцию компаратора, которая сравнивает более одного параметра и сортирует структуру данных на основе условий, предоставленных компаратором. Ниже представлена ​​реализация множественных сравнений в очереди приоритетов C++.

С++

#include <bits/stdc++.h>
using namespace std;
// Structure of a user defined data structure
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;
    }
};
// Here we are sorting based on the processing time
// if the priority is same and we are sorting
// in descending order if the priority is same.
// Else we are sorting in ascending order
// on the priority of the tasks given to us
struct compare {
    bool operator()(jobs a, jobs b)
    {
        if (a.priority == b.priority) {
            return a.processing < b.processing;
        }
        return a.priority > b.priority;
    }
};
// Driver code
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, "somejob" + 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 somejob8
0 8 7 6 somejob7
3 3 2 4 somejob2
4 2 3 3 somejob1
6 1 1 6 somejob0
7 5 5 3 somejob4
7 4 5 4 somejob3
10 10 10 6 somejob9
10 7 7 5 somejob6
10 6 5 4 somejob5

Оцените статью
bestprogrammer.ru
Добавить комментарий

Adblock
detector