# priority_queue c++

i want to make a min priority_queue of pair integers. but what i want to do is suppose first integer of one of the pair is 10 and second is 20 and that of a another pair first is 10 and second is also 10 i want that if two having equal value of first than than the one having more value of second should be popped first.

2 Likes

Priority queue sorts only according to first elements. You can rather create a vector of pairs and sort function does this thing

Up vote me … I am not able to ask questions

1 Like

even sort function will sort according to first element

You can perform this by using stl in c++.

EDIT : The default comparator for the priority queue is (l < r). You can see that in the constructor default parameter, By modifying the comparator in priority_queue you’d get the desired min priority queue.

bool operator() function compares the pairs. You can see that first, it will check whether the first element of pairs is equal or not if it’s equal the constructor will do as you want.(Put the pair with a larger second on top().) if not then put the pair with larger first on top().

Here’s the code

``````#include "bits/stdc++.h"
using namespace std;

struct compare
{
bool operator()(pair<int, int> p1,pair<int,int> p2) {
if(p1.first == p2.first)
return p1.second < p2.second;
else
return p1.first > p2.first;    // ***EDIT***
}
};
int main()
{
priority_queue<pair<int,int>,vector<pair<int,int>>,compare> pq;
pq.push(make_pair(10,20));
pq.push(make_pair(2,10));
pq.push(make_pair(1,5));
pq.push(make_pair(10,10));
while(!pq.empty())
{
pair<int, int> w = pq.top();
cout << w.first << " " << w.second << endl;;
pq.pop();
}
}
``````

1 Like

guys, please upvote me. i am new here. nad not able to ask question

1 Like

this will sort only according to first element …

No , sort function sorts a pairs in vector according to the two elements

#include “bits/stdc++.h”
using namespace std;

int main()
{
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
pq.push(make_pair(10,20));
pq.push(make_pair(10,10));
pq.push({10,2});
while(!pq.empty())
{
pair<int, int> w = pq.top();
cout << w.first << " " << w.second << endl;;
pq.pop();
}
}

you can declare a priority queue like this and this will do the task for you .

No…it will not work

no…its not working…it only sort according to the second element

give input
(10 20),
(10 10),
(2 10),
(1 5),
output should be
(1 5),
(2 10),
(10 20),
(10 10)

given input (10 20), (10 10), (2 10), (1 5), output should be (1 5), (2 10), (10 20), (10 10)

``````
[1]

[1]: http://ideone.com/bUeZxs``````
1 Like

its working …but can you please explain the logic. That will be very helpful.

yeah…I got it…Thank You

can you explain how operator works

Bolanet88.net merupakan situs agen judi bola terpercaya yang menawarkan permainan judi online terlengkap.
situs judi bola resmi
agen taruhan bola indonesia
bandar judi tangkas online uang asli
daftar akun sbobet ibcbet

Please read the edited answer.

//