Antrian prioritas stl default adalah Max (Fungsi atas mengembalikan elemen terbesar).
Katakan, untuk kesederhanaan, itu adalah antrian prioritas dari nilai int.
Antrian prioritas stl default adalah Max (Fungsi atas mengembalikan elemen terbesar).
Katakan, untuk kesederhanaan, itu adalah antrian prioritas dari nilai int.
Jawaban:
Gunakan std::greater
sebagai fungsi perbandingan:
std::priority_queue<int, std::vector<int>, std::greater<int> > my_min_heap;
operator<
;)
vector
dan deque
memenuhi persyaratan yang harus dipenuhi oleh container yang mendasari untuk sebuah priority_queue. Anda juga dapat menggunakan kelas penampung khusus. Anda dapat menemukan penjelasan yang lebih rinci di cplusplus.com/reference/queue/priority_queue
Salah satu caranya adalah dengan menentukan komparator yang cocok untuk beroperasi pada antrian prioritas biasa, sehingga prioritasnya dibalik:
#include <iostream>
#include <queue>
using namespace std;
struct compare
{
bool operator()(const int& l, const int& r)
{
return l > r;
}
};
int main()
{
priority_queue<int,vector<int>, compare > pq;
pq.push(3);
pq.push(5);
pq.push(1);
pq.push(8);
while ( !pq.empty() )
{
cout << pq.top() << endl;
pq.pop();
}
cin.get();
}
Yang akan menghasilkan masing-masing 1, 3, 5, 8.
Beberapa contoh penggunaan antrian prioritas melalui implementasi STL dan Sedgewick diberikan di sini .
Parameter kerangka ketiga untuk priority_queue
adalah pembanding. Setel untuk digunakan greater
.
misalnya
std::priority_queue<int, std::vector<int>, std::greater<int> > max_queue;
Anda harus #include <functional>
untuk std::greater
.
Anda dapat melakukannya dengan berbagai cara:
1. Menggunakan greater
sebagai fungsi perbandingan:
#include <bits/stdc++.h>
using namespace std;
int main()
{
priority_queue<int,vector<int>,greater<int> >pq;
pq.push(1);
pq.push(2);
pq.push(3);
while(!pq.empty())
{
int r = pq.top();
pq.pop();
cout<<r<< " ";
}
return 0;
}
2. Memasukkan nilai dengan mengubah tandanya (menggunakan minus (-) untuk bilangan positif dan menggunakan plus (+) untuk bilangan negatif:
int main()
{
priority_queue<int>pq2;
pq2.push(-1); //for +1
pq2.push(-2); //for +2
pq2.push(-3); //for +3
pq2.push(4); //for -4
while(!pq2.empty())
{
int r = pq2.top();
pq2.pop();
cout<<-r<<" ";
}
return 0;
}
3. Menggunakan struktur atau kelas khusus:
struct compare
{
bool operator()(const int & a, const int & b)
{
return a>b;
}
};
int main()
{
priority_queue<int,vector<int>,compare> pq;
pq.push(1);
pq.push(2);
pq.push(3);
while(!pq.empty())
{
int r = pq.top();
pq.pop();
cout<<r<<" ";
}
return 0;
}
4. Menggunakan struktur atau kelas kustom, Anda dapat menggunakan priority_queue dalam urutan apa pun. Misalkan, kita ingin mengurutkan orang-orang menurut gajinya dan jika seri menurut usianya.
struct people
{
int age,salary;
};
struct compare{
bool operator()(const people & a, const people & b)
{
if(a.salary==b.salary)
{
return a.age>b.age;
}
else
{
return a.salary>b.salary;
}
}
};
int main()
{
priority_queue<people,vector<people>,compare> pq;
people person1,person2,person3;
person1.salary=100;
person1.age = 50;
person2.salary=80;
person2.age = 40;
person3.salary = 100;
person3.age=40;
pq.push(person1);
pq.push(person2);
pq.push(person3);
while(!pq.empty())
{
people r = pq.top();
pq.pop();
cout<<r.salary<<" "<<r.age<<endl;
}
Hasil yang sama dapat diperoleh dengan kelebihan beban operator:
struct people
{
int age,salary;
bool operator< (const people & p)const
{
if(salary==p.salary)
{
return age>p.age;
}
else
{
return salary>p.salary;
}
}};
Dalam fungsi utama:
priority_queue<people> pq;
people person1,person2,person3;
person1.salary=100;
person1.age = 50;
person2.salary=80;
person2.age = 40;
person3.salary = 100;
person3.age=40;
pq.push(person1);
pq.push(person2);
pq.push(person3);
while(!pq.empty())
{
people r = pq.top();
pq.pop();
cout<<r.salary<<" "<<r.age<<endl;
}
bool operator > (const people & p)const
dalam 5) kelebihan operator
<
kelebihan beban seperti itu, lebih baik membebani >
dan menggunakangreater<people>
Di C ++ 11 Anda juga bisa membuat alias untuk kenyamanan:
template<class T> using min_heap = priority_queue<T, std::vector<T>, std::greater<T>>;
Dan gunakan seperti ini:
min_heap<int> my_heap;
Salah satu cara untuk mengatasi masalah ini adalah, tekan negatif setiap elemen di priority_queue sehingga elemen terbesar akan menjadi elemen terkecil. Pada saat membuat operasi pop, ambil negasi dari setiap elemen.
#include<bits/stdc++.h>
using namespace std;
int main(){
priority_queue<int> pq;
int i;
// push the negative of each element in priority_queue, so the largest number will become the smallest number
for (int i = 0; i < 5; i++)
{
cin>>j;
pq.push(j*-1);
}
for (int i = 0; i < 5; i++)
{
cout<<(-1)*pq.top()<<endl;
pq.pop();
}
}
Berdasarkan semua jawaban di atas, saya membuat kode contoh cara membuat antrian prioritas. Catatan: Ia bekerja pada kompiler C ++ 11 dan di atasnya
#include <iostream>
#include <vector>
#include <iomanip>
#include <queue>
using namespace std;
// template for prirority Q
template<class T> using min_heap = priority_queue<T, std::vector<T>, std::greater<T>>;
template<class T> using max_heap = priority_queue<T, std::vector<T>>;
const int RANGE = 1000;
vector<int> get_sample_data(int size);
int main(){
int n;
cout << "Enter number of elements N = " ; cin >> n;
vector<int> dataset = get_sample_data(n);
max_heap<int> max_pq;
min_heap<int> min_pq;
// Push data to Priority Queue
for(int i: dataset){
max_pq.push(i);
min_pq.push(i);
}
while(!max_pq.empty() && !min_pq.empty()){
cout << setw(10) << min_pq.top()<< " | " << max_pq.top() << endl;
min_pq.pop();
max_pq.pop();
}
}
vector<int> get_sample_data(int size){
srand(time(NULL));
vector<int> dataset;
for(int i=0; i<size; i++){
dataset.push_back(rand()%RANGE);
}
return dataset;
}
Output dari kode Di Atas
Enter number of elements N = 4
33 | 535
49 | 411
411 | 49
535 | 33
Kami dapat melakukan ini dengan beberapa cara.
int main()
{
priority_queue<int, vector<int>, greater<int> > pq;
pq.push(40);
pq.push(320);
pq.push(42);
pq.push(65);
pq.push(12);
cout<<pq.top()<<endl;
return 0;
}
struct comp
{
bool operator () (int lhs, int rhs)
{
return lhs > rhs;
}
};
int main()
{
priority_queue<int, vector<int>, comp> pq;
pq.push(40);
pq.push(320);
pq.push(42);
pq.push(65);
pq.push(12);
cout<<pq.top()<<endl;
return 0;
}
operator>
, yang akan bekerja seperti pesonastd::greater
. Anda juga dapat menulis functor Anda sendiri daripadastd::greater
jika Anda suka.