Bagaimana cara menggunakan C ++ Priority_queue?

How Use C Priority_queue

Dalam C ++, antrian adalah struktur data senarai di mana elemen pertama yang dimasukkan dalam senarai adalah elemen pertama yang akan dikeluarkan, ketika penyingkiran dilakukan. Baris keutamaan dalam C ++ serupa, tetapi mempunyai beberapa pesanan; ia adalah elemen dengan nilai terbesar yang dikeluarkan terlebih dahulu. Baris keutamaan masih dapat dikonfigurasi sehingga elemen dengan nilai paling sedikit yang dikeluarkan terlebih dahulu. Sebarang barisan mesti mempunyai sekurang-kurangnya tolak () fungsi dan pop () fungsi. The tolak () fungsi menambah elemen baru di bahagian belakang. Untuk barisan biasa, pop () fungsi membuang elemen pertama yang diturunkan. Untuk barisan keutamaan, pop () fungsi membuang elemen dengan keutamaan tertinggi, yang mungkin terbesar atau terkecil, bergantung pada skema pesanan.

Untuk menggunakan C ++ priority_queue, program harus dimulakan dengan kod seperti:



#sertakan
#sertakan
menggunakan ruang namaJam;

Ia merangkumi perpustakaan antrian ke dalam program.



Untuk terus membaca, pembaca semestinya mempunyai pengetahuan asas mengenai C ++.



Kandungan Artikel

Pembinaan Asas

Struktur data harus dibina terlebih dahulu sebelum dapat digunakan. Pembinaan di sini bermaksud menunjukkan objek dari kelas barisan perpustakaan. Objek beratur mesti mempunyai nama yang diberikan kepadanya oleh pengaturcara. Sintaks paling mudah untuk membuat barisan keutamaan adalah:

keutamaan_queue<menaip>queueName;

Dengan sintaks ini, nilai terbesar dikeluarkan terlebih dahulu. Contoh contoh adalah:

keutamaan_queue<int>pq;

atau



keutamaan_queue<char>pq;

Vektor dan deque adalah dua struktur data dalam C ++. Priority_queue boleh dibuat dengan salah satu daripadanya. Sintaks untuk membuat barisan keutamaan dari struktur vektor adalah:

keutamaan_queue<jenis, vektor<jenis yang sama>, membandingkan>pq;

Contoh contoh ini adalah:

keutamaan_queue<int, vektor<int>, kurang<int> >pq;

Perhatikan jurang antara> dan> di akhir deklarasi. Ini untuk mengelakkan kekeliruan dengan >>. Kod perbandingan lalai adalah kurang, yang bermaksud nilai terbesar, dan tidak semestinya nilai pertama, akan dikeluarkan terlebih dahulu. Jadi, penyataan penciptaan hanya boleh ditulis sebagai:

keutamaan_queue<int, vektor<int> >pq;

Sekiranya nilai paling sedikit dihapuskan terlebih dahulu, maka pernyataannya mestilah:

keutamaan_queue<int, vektor<int>, lebih hebat<int> >pq;

Fungsi Anggota Penting

Fungsi tolak ()
Fungsi ini mendorong nilai, yang merupakan argumennya, ke priority_queue. Ia kembali terbatal. Kod berikut menggambarkan ini:

keutamaan_queue<int>pq;

pq.tolak(10);
pq.tolak(30);
pq.tolak(dua puluh);
pq.tolak(lima puluh);
pq.tolak(40);

Priority_queue ini telah menerima 5 nilai integer dalam urutan 10, 30, 20, 50, 40. Sekiranya semua elemen ini dikeluarkan dari barisan keutamaan, maka elemen tersebut akan keluar dalam urutan 50, 40, 30, 20, 10.

Fungsi pop ()
Fungsi ini membuang dari priority_queue nilai dengan keutamaan tertinggi. Sekiranya kod perbandingan lebih besar, maka ia akan membuang elemen dengan nilai terkecil. Sekiranya dipanggil lagi, ia akan menghilangkan elemen seterusnya dengan nilai terkecil selebihnya; dipanggil lagi, ia akan menghilangkan nilai terkecil yang seterusnya, dan seterusnya. Ia kembali terbatal. Kod berikut menggambarkan ini:

keutamaan_queue<char, vektor<char>, lebih hebat<int> >pq;
pq.tolak('ke');pq.tolak('c');pq.tolak('b');pq.tolak('Dan');pq.tolak('d');

Perhatikan bahawa untuk memanggil fungsi anggota, nama objek harus diikuti dengan titik, dan kemudian fungsi.

Fungsi teratas ()
The pop () fungsi menghilangkan nilai keutamaan tertinggi berikutnya, tetapi tidak mengembalikannya, sebagai pop () adalah fungsi batal. Menggunakan atas () berfungsi untuk mengetahui nilai keutamaan tertinggi yang harus dikeluarkan seterusnya. The atas () fungsi mengembalikan salinan nilai keutamaan tertinggi di priority_queue. Kod berikut, di mana nilai keutamaan tertinggi seterusnya adalah nilai paling rendah, menggambarkan ini

keutamaan_queue<char, vektor<char>, lebih hebat<int> >pq;
pq.tolak('ke');pq.tolak('c');pq.tolak('b');pq.tolak('Dan');pq.tolak('d');
charch1=pq.bahagian atas();pq.pop();
charch2=pq.bahagian atas();pq.pop();
charch3=pq.bahagian atas();pq.pop();
charch4=pq.bahagian atas();pq.pop();
charch5=pq.bahagian atas();pq.pop();

kos<<ch1<<''<<ch2<<''<<ch3<<''<<ch4<<''<<ch5<<' n';

Keluarannya adalah 'a' 'b' 'c' 'd' 'e'.

Fungsi kosong ()
Sekiranya pengaturcara menggunakan atas () berfungsi pada priority_queue kosong, setelah penyusunan berjaya, dia akan menerima mesej ralat seperti:

Kesalahan segmentasi(teras dibuang)

Oleh itu, selalu periksa apakah barisan keutamaan tidak kosong sebelum menggunakan atas () fungsi. The kosong () fungsi anggota mengembalikan bool, benar, jika barisan kosong, dan salah jika barisan tidak kosong. Kod berikut menggambarkan ini:

keutamaan_queue<int>pq;
inti1= 10; inti2= 30; inti3= dua puluh; inti4= lima puluh; inti5= 40;
pq.tolak(i1);pq.tolak(i2);pq.tolak(i3);pq.tolak(i4);pq.tolak(i5);

sementara(!pq.kosong())
{
kos <<pq.bahagian atas() << '';
pq.pop();
}
kos << ' n';

Fungsi Baris Keutamaan Lain

Ukuran () Fungsi
Fungsi ini mengembalikan panjang giliran keutamaan, seperti yang ditunjukkan oleh kod berikut:

keutamaan_queue<int>pq;
inti1= 10; inti2= 30; inti3= dua puluh; inti4= lima puluh; inti5= 40;
pq.tolak(i1);pq.tolak(i2);pq.tolak(i3);pq.tolak(i4);pq.tolak(i5);

intlen=pq.ukuran();
kos <<len<< ' n';

Keluarannya adalah 5.

Fungsi pertukaran ()
Sekiranya dua priority_queues mempunyai jenis dan ukuran yang sama, maka mereka boleh ditukar dengan fungsi ini, seperti yang ditunjukkan oleh kod berikut:

keutamaan_queue<int>pq1;
inti1= 10; inti2= 30; inti3= dua puluh; inti4= lima puluh; inti5= 40;
pq1.tolak(i1);pq1.tolak(i2);pq1.tolak(i3);pq1.tolak(i4);pq1.tolak(i5);

keutamaan_queue<int>pqA;
intia1= 1; intia2= 3; intia3= 2; intia4= 5; intia5= 4;
pqA.tolak(ia1);pqA.tolak(ia2);pqA.tolak(ia3);pqA.tolak(ia4);pqA.tolak(ia5);

pq1.pertukaran(pqA);

sementara(!pq1.kosong())
{
kos <<pq1.bahagian atas() << '';
pq1.pop();
} kos<<' n';

sementara(!pqA.kosong())
{
kos <<pqA.bahagian atas() << '';
pqA.pop();
} kos<<' n';

Keluarannya adalah:

& emsp; 5 & emsp; 4 & emsp; 3 & emsp; 2 & emsp; 1
& emsp; 50 & emsp; 40 & emsp; 30 & emsp; 20 & emsp; 10

Tempat letak () Fuction
The tempat () fungsi serupa dengan fungsi tolak. Kod berikut menggambarkan ini:

keutamaan_queue<int>pq1;
inti1= 10; inti2= 30; inti3= dua puluh; inti4= lima puluh; inti5= 40;
pq1.menempatkan(i1);pq1.menempatkan(i2);pq1.menempatkan(i3);pq1.menempatkan(i4);pq1.menempatkan(i5);

sementara(!pq1.kosong())
{
kos <<pq1.bahagian atas() << '';
pq1.pop();
} kos<<' n';

Keluarannya adalah:

50 40 30 20 10

Data Rentetan

Semasa membandingkan rentetan, kelas rentetan harus digunakan dan bukan penggunaan langsung dari string string kerana akan membandingkan penunjuk dan bukan rentetan yang sebenarnya. Kod berikut menunjukkan bagaimana kelas rentetan digunakan:

#sertakan
keutamaan_queue<tali>pq1;
tali s1=tali('pen'), s2=tali('pensel'), s3=tali('buku latihan'), s4=tali('buku teks'), s5=tali('penguasa');

pq1.tolak(s1);pq1.tolak(s2);pq1.tolak(s3);pq1.tolak(s4);pq1.tolak(s5);
sementara(!pq1.kosong())
{
kos <<pq1.bahagian atas() << '';
pq1.pop();
} kos<<' n';

Keluarannya adalah:

Buku latihan & emsp; buku teks & emsp; pembaris & emsp; pen & emsp; pen & emsp; buku latihan

Pembinaan Baris Keutamaan Lain

Penciptaan Eksplisit dari Vektor
Baris keutamaan dapat dibuat secara eksplisit dari vektor seperti yang ditunjukkan oleh kod berikut:

#sertakan
vektor<int>vtr= {10,30,dua puluh,lima puluh,40};

keutamaan_queue<int>pq(vtr.bermula(), vtr.akhir());

sementara(!pq.kosong())
{
kos <<pq.bahagian atas() << '';
pq.pop();
} kos<<' n';

Keluarannya ialah: 50 40 30 20 10. Kali ini, tajuk vektor juga harus disertakan. Argumen untuk fungsi konstruktor mengambil petunjuk awal dan akhir vektor. Jenis data untuk vektor dan jenis data untuk priority_queue mestilah sama.

Untuk menjadikan nilai yang paling rendah sebagai keutamaan, deklarasi untuk pembina adalah:

keutamaan_queue<int, vektor<int>, lebih hebat>int> >pq(vtr.bermula(), vtr.akhir());

Penciptaan Eksplisit dari Array
Baris keutamaan dapat dibuat secara eksplisit dari array seperti yang ditunjukkan oleh kod berikut:

intarr[] = {10,30,dua puluh,lima puluh,40};

keutamaan_queue<int>pq(arr, arr+5);

sementara(!pq.kosong())
{
kos <<pq.bahagian atas() << '';
pq.pop();
} kos<<' n';

Keluarannya adalah: 50 40 30 20 10. Argumen untuk fungsi konstruktor mengambil titik permulaan dan akhir array. arr mengembalikan penunjuk permulaan, arr + 5 mengembalikan penunjuk tepat melepasi tatasusunan, dan 5 adalah ukuran array. Jenis data untuk array dan jenis data untuk priority_queue mestilah sama.

Untuk menjadikan nilai yang paling rendah sebagai keutamaan, deklarasi untuk pembina adalah:

keutamaan_queue<int, vektor<int>, lebih hebat<int> >pq(arr, arr+5);

Catatan: Dalam C ++, priority_queue sebenarnya disebut penyesuai, bukan hanya bekas.

Kod Perbandingan Tersuai

Memiliki semua nilai dalam barisan keutamaan menaik atau semua menurun bukan satu-satunya pilihan untuk barisan keutamaan. Contohnya, senarai 11 bilangan bulat untuk timbunan maksimum ialah:

88, 86, 87, 84, 82, 79,74, 80, 81 ,, 64, 69

Nilai tertinggi adalah 88. Ini diikuti oleh dua nombor: 86 dan 87, yang kurang dari 88. Nombor selebihnya kurang daripada tiga nombor ini, tetapi tidak betul-betul teratur. Terdapat dua sel kosong dalam senarai. Nombor 84 dan 82 kurang daripada 86. Angka 79 dan 74 kurang daripada 87. Angka 80 dan 81 kurang daripada 84. Nombor 64 dan 69 kurang dari 79.

Penempatan nombor mengikut kriteria timbunan maksimum - lihat kemudian. Untuk menyediakan skema seperti itu untuk priority_queue, pengaturcara harus menyediakan kod perbandingannya sendiri - lihat kemudian.

Kesimpulannya

Priority_queue C ++ adalah barisan pertama dalam keluar. Fungsi anggota, tolak (), menambah nilai baru ke dalam barisan. Fungsi anggota, atas (), membaca nilai teratas dalam barisan. Fungsi anggota, pop (), mengalih keluar tanpa mengembalikan nilai tertinggi giliran. Fungsi anggota, kosong (), memeriksa sama ada barisan kosong. Walau bagaimanapun, priority_queue berbeza dari barisan, kerana itu, ia mengikuti beberapa algoritma keutamaan. Ini boleh menjadi yang terbaik, dari yang pertama hingga yang terakhir, atau paling tidak, dari yang pertama hingga yang terakhir. Kriteria (algoritma) juga boleh ditentukan oleh pengaturcara.