Priority queue of pairs in C++ with ordering by first and second element

Priority Queue: Priority queue is the extension of the queue in which elements associated with priority and elements having higher priority is popped first.

Priority queue can contain elements with various data types such as integer, pair of integers, custom data type. But one thing is common that there is one element that defines the priority of the element.
Therefore, the Priority queue of pairs can have two types of ordering –

  • Ordered by the first element of pair
  • Ordered by the second element of pair

Priority Queue ordered by first element

In C++ if the element is in the form of pairs, then by default the priority of the elements is dependent upon the first element. Therefore, we just have to use the priority queue of pairs only.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the
// priority queue of pairs
// ordered by the first element
  
#include <iostream>
#include <queue>
using namespace std;
  
// Function to print the data of
// the priority queue ordered by first
void showpq(
    priority_queue<pair<int, int> > g)
{
    // Loop to print the elements
    // until the priority queue
    // is not empty
    while (!g.empty()) {
        cout << g.top().first
             << " " << g.top().second
             << endl;
        g.pop();
    }
    cout << endl;
}
  
// Driver Code
int main()
{
    priority_queue<pair<int, int> > p1;
  
    // Insertion of elements
    p1.push(make_pair(4, 5));
    p1.push(make_pair(5, 4));
    p1.push(make_pair(1, 6));
    p1.push(make_pair(7, 3));
    p1.push(make_pair(9, 4));
    showpq(p1);
    return 0;
}

chevron_right


Output:

9 4
7 3
5 4
4 5
1 6

Note: If the first element of some pairs will be same, then the comparison will be made on the basis of the second element.



Priority Queue ordered by second element (Max)

The idea is to use structure with the concept of the operator overloading in the priority queue for ordering the pairs by its second element.

Below is the implementation of the priority queue ordered by second element –

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the
// priority queue in which elements
// are sorted by the second element
  
#include <iostream>
#include <queue>
#include <vector>
  
using namespace std;
  
typedef pair<int, int> pd;
  
// Structure of the condition
// for sorting the pair by its
// second elements
struct myComp {
    constexpr bool operator()(
        pair<int, int> const& a,
        pair<int, int> const& b)
        const noexcept
    {
        return a.second < b.second;
    }
};
  
// Function to show the elements
// of the priority queue
void showpq(
    priority_queue<pd,
                   vector<pd>, myComp>
        g)
{
    // Loop to print the elements
    // until the priority queue
    // is not empty
    while (!g.empty()) {
        cout << g.top().first
             << " " << g.top().second
             << endl;
        g.pop();
    }
    cout << endl;
}
  
// Driver Code
int main()
{
    priority_queue<pd, vector<pd>, myComp> p1;
    p1.push(make_pair(4, 5));
    p1.push(make_pair(5, 4));
    p1.push(make_pair(1, 6));
    p1.push(make_pair(7, 3));
    p1.push(make_pair(9, 4));
  
    // Function Call
    showpq(p1);
    return 0;
}

chevron_right


Output:

1 6
4 5
9 4
5 4
7 3

Priority queue ordered by second element (Min)

The idea is to use the operator overloading to implement the priority queue ordered by its second element with the minimum element at the top.

Below is the implementation of the priority queue:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the priority
// queue sorted by the second element
// in the decreasing order
  
#include <iostream>
#include <queue>
#include <vector>
  
using namespace std;
  
typedef pair<int, int> pd;
  
// Structure of the operator
// overloading for comparison
struct myComp {
    constexpr bool operator()(
        pair<int, int> const& a,
        pair<int, int> const& b)
        const noexcept
    {
        return a.second > b.second;
    }
};
  
// Function to print the elements
// of the priority queue
void showpq(
    priority_queue<pd, vector<pd>, myComp> g)
{
    // Loop to print the elements
    // of the priority queue
    while (!g.empty()) {
        cout << g.top().first
             << " " << g.top().second
             << endl;
        g.pop();
    }
    cout << endl;
}
  
// Driver Code
int main()
{
    priority_queue<pd, vector<pd>, myComp> p1;
  
    // Insertion of the elements
    p1.push(make_pair(4, 5));
    p1.push(make_pair(5, 4));
    p1.push(make_pair(1, 6));
    p1.push(make_pair(7, 3));
    p1.push(make_pair(9, 4));
    showpq(p1);
    return 0;
}

chevron_right


Output:

7 3
5 4
9 4
4 5
1 6

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : Akanksha_Rai