Untuk menggunakan C++ priority_queue, program harus dimulai dengan kode seperti:
#termasuk
#termasuk
menggunakan ruang namajam;
Ini termasuk perpustakaan antrian ke dalam program.
Untuk melanjutkan membaca, pembaca harus memiliki pengetahuan dasar tentang C++.
Isi Artikel
- Konstruksi Dasar
- Fungsi Anggota Penting
- Fungsi Antrian Prioritas Lainnya
- String Data
- Konstruksi Antrian Prioritas Lainnya
- Kesimpulan
Konstruksi Dasar
Struktur data harus dibangun terlebih dahulu sebelum dapat digunakan. Konstruksi di sini berarti membuat instance objek dari kelas antrian perpustakaan. Objek antrian kemudian harus memiliki nama yang diberikan oleh programmer. Sintaks paling sederhana untuk membuat antrian prioritas adalah:
prioritas_antrian<Tipe>nama antrian;
Dengan sintaks ini, nilai terbesar dihilangkan terlebih dahulu. Contoh Instansiasi adalah :
prioritas_antrian<ke dalam>pq;atau
prioritas_antrian<arang>pq;
Vektor dan deque adalah dua struktur data dalam C++. Prioritas_antrian dapat dibuat dengan salah satu dari mereka. Sintaks untuk membuat antrian prioritas dari struktur vektor adalah:
prioritas_antrian<jenis, vektor<Tipe yang sama>, membandingkan>pq;Contoh dari instantiasi ini adalah:
prioritas_antrian<ke dalam, vektor<ke dalam>, lebih sedikit<ke dalam> >pq;Perhatikan jarak antara > dan > di akhir deklarasi. Ini untuk mencegah kebingungan dengan >>. Kode perbandingan default lebih kecil, artinya nilai terbesar, dan belum tentu nilai pertama, akan dihapus terlebih dahulu. Jadi, pernyataan penciptaan secara sederhana dapat ditulis sebagai:
prioritas_antrian<ke dalam, vektor<ke dalam> >pq;Jika nilai terkecil harus dihilangkan terlebih dahulu, maka pernyataannya harus:
prioritas_antrian<ke dalam, vektor<ke dalam>, lebih besar<ke dalam> >pq;Fungsi Anggota Penting
Fungsi push()
Fungsi ini mendorong nilai, yang merupakan argumennya, ke dalam priority_queue. Ia kembali batal. Kode berikut menggambarkan hal ini:
hal.dorongan(10);
hal.dorongan(30);
hal.dorongan(dua puluh);
hal.dorongan(lima puluh);
hal.dorongan(40);
Priority_queue ini telah menerima 5 nilai integer dalam urutan 10, 30, 20, 50, 40. Jika semua elemen ini harus dikeluarkan dari antrian prioritas, maka mereka akan keluar dalam urutan 50, 40, 30, 20, 10.
Fungsi pop()
Fungsi ini menghapus dari priority_queue nilai dengan prioritas tertinggi. Jika kode perbandingan lebih besar, maka akan menghapus elemen dengan nilai terkecil. Jika dipanggil lagi, ia menghapus elemen berikutnya dengan nilai terkecil dari sisanya; dipanggil lagi, itu menghilangkan nilai terkecil berikutnya yang ada, dan seterusnya. Ia kembali batal. Kode berikut menggambarkan hal ini:
hal.dorongan('ke');hal.dorongan('C');hal.dorongan('B');hal.dorongan('Dan');hal.dorongan('D');
Perhatikan bahwa untuk memanggil fungsi anggota, nama objek harus diikuti oleh titik, lalu fungsi.
Fungsi atas ()
NS pop () fungsi menghapus nilai prioritas tertinggi berikutnya, tetapi tidak mengembalikannya, karena pop () adalah fungsi kosong. Menggunakan atas() berfungsi untuk mengetahui nilai prioritas tertinggi yang harus dihilangkan selanjutnya. NS atas() fungsi mengembalikan salinan nilai prioritas tertinggi di priority_queue. Kode berikut, di mana nilai prioritas tertinggi berikutnya adalah nilai terkecil, menggambarkan hal ini:
hal.dorongan('ke');hal.dorongan('C');hal.dorongan('B');hal.dorongan('Dan');hal.dorongan('D');
arangch1=hal.atas();hal.pop();
arangch2=hal.atas();hal.pop();
arangch3=hal.atas();hal.pop();
arangch4=hal.atas();hal.pop();
arangch5=hal.atas();hal.pop();
biaya<<ch1<<''<<ch2<<''<<ch3<<''<<ch4<<''<<ch5<<' ';
Outputnya adalah 'a' 'b' 'c' 'd' 'e'.
Fungsi kosong()
Jika seorang programmer menggunakan atas() berfungsi pada priority_queue yang kosong, setelah kompilasi berhasil, ia akan menerima pesan kesalahan seperti:
Jadi, selalu periksa apakah antrian prioritas tidak kosong sebelum menggunakan atas() fungsi. NS kosong() fungsi anggota mengembalikan bool, true, jika antrian kosong, dan false jika antrian tidak kosong. Kode berikut menggambarkan hal ini:
prioritas_antrian<ke dalam>pq;ke dalami1= 10; ke dalami2= 30; ke dalami3= dua puluh; ke dalami4= lima puluh; ke dalami5= 40;
hal.dorongan(i1);hal.dorongan(i2);hal.dorongan(i3);hal.dorongan(i4);hal.dorongan(i5);
ketika(!hal.kosong())
{
biaya <<hal.atas() << '';
hal.pop();
}
biaya << ' ';
Fungsi Antrian Prioritas Lainnya
Ukuran() Fungsi
Fungsi ini mengembalikan panjang antrian prioritas, seperti yang diilustrasikan oleh kode berikut:
ke dalami1= 10; ke dalami2= 30; ke dalami3= dua puluh; ke dalami4= lima puluh; ke dalami5= 40;
hal.dorongan(i1);hal.dorongan(i2);hal.dorongan(i3);hal.dorongan(i4);hal.dorongan(i5);
ke dalamlen=hal.ukuran();
biaya <<len<< ' ';
Keluarannya adalah 5.
Fungsi swap()
Jika dua priority_queues memiliki tipe dan ukuran yang sama, maka keduanya dapat ditukar dengan fungsi ini, seperti yang ditunjukkan oleh kode berikut:
ke dalami1= 10; ke dalami2= 30; ke dalami3= dua puluh; ke dalami4= lima puluh; ke dalami5= 40;
pq1.dorongan(i1);pq1.dorongan(i2);pq1.dorongan(i3);pq1.dorongan(i4);pq1.dorongan(i5);
prioritas_antrian<ke dalam>pqA;
ke dalamitu1= 1; ke dalamitu2= 3; ke dalamitu3= 2; ke dalamitu4= 5; ke dalamitu5= 4;
pqA.dorongan(itu1);pqA.dorongan(itu2);pqA.dorongan(itu3);pqA.dorongan(itu4);pqA.dorongan(itu5);
pq1.menukar(pqA);
ketika(!pq1.kosong())
{
biaya <<pq1.atas() << '';
pq1.pop();
} biaya<<' ';
ketika(!pqA.kosong())
{
biaya <<pqA.atas() << '';
pqA.pop();
} biaya<<' ';
Outputnya adalah:
5 4 3 2 1
50 40 30 20 10
Emplase() Fungsi
NS menempatkan() fungsinya mirip dengan fungsi push. Kode berikut menggambarkan hal ini:
ke dalami1= 10; ke dalami2= 30; ke dalami3= dua puluh; ke dalami4= lima puluh; ke dalami5= 40;
pq1.menempatkan(i1);pq1.menempatkan(i2);pq1.menempatkan(i3);pq1.menempatkan(i4);pq1.menempatkan(i5);
ketika(!pq1.kosong())
{
biaya <<pq1.atas() << '';
pq1.pop();
} biaya<<' ';
Outputnya adalah:
50 40 30 20 10
String Data
Saat membandingkan string, kelas string harus digunakan dan bukan penggunaan langsung literal string karena akan membandingkan pointer dan bukan string yang sebenarnya. Kode berikut menunjukkan bagaimana kelas string digunakan:
#termasukprioritas_antrian<rangkaian>pq1;
senar s1=rangkaian('pena'), s2=rangkaian('pensil'), s3=rangkaian('buku latihan'), s4=rangkaian('buku teks'), s5=rangkaian('penggaris');
pq1.dorongan(s1);pq1.dorongan(s2);pq1.dorongan(s3);pq1.dorongan(s4);pq1.dorongan(s5);
ketika(!pq1.kosong())
{
biaya <<pq1.atas() << '';
pq1.pop();
} biaya<<' ';
Outputnya adalah:
buku teks penggaris pensil pena buku latihan
Konstruksi Antrian Prioritas Lainnya
Penciptaan Eksplisit dari Vektor
Antrian prioritas dapat dibuat secara eksplisit dari vektor seperti yang ditunjukkan oleh kode berikut:
vektor<ke dalam>vtr= {10,30,dua puluh,lima puluh,40};
prioritas_antrian<ke dalam>pq(vtr.mulai(), vtr.akhir());
ketika(!hal.kosong())
{
biaya <<hal.atas() << '';
hal.pop();
} biaya<<' ';
Outputnya adalah: 50 40 30 20 10. Kali ini, header vektor juga harus disertakan. Argumen untuk fungsi konstruktor mengambil pointer awal dan akhir dari vektor. Tipe data untuk vektor dan tipe data untuk priority_queue harus sama.
Untuk menjadikan nilai terkecil sebagai prioritas, deklarasi untuk konstruktor adalah:
prioritas_antrian<ke dalam, vektor<ke dalam>, lebih besar>ke dalam> >pq(vtr.mulai(), vtr.akhir()); Penciptaan Eksplisit dari Array
Antrian prioritas dapat dibuat secara eksplisit dari array seperti yang ditunjukkan oleh kode berikut:
prioritas_antrian<ke dalam>pq(arr, arr+5);
ketika(!hal.kosong())
{
biaya <<hal.atas() << '';
hal.pop();
} biaya<<' ';
Outputnya adalah: 50 40 30 20 10. Argumen untuk fungsi konstruktor mengambil pointer awal dan akhir dari array. arr mengembalikan pointer awal, arr+5 mengembalikan pointer yang melewati array, dan 5 adalah ukuran array. Tipe data untuk array dan tipe data untuk priority_queue harus sama.
Untuk menjadikan nilai terkecil sebagai prioritas, deklarasi untuk konstruktor adalah:
prioritas_antrian<ke dalam, vektor<ke dalam>, lebih besar<ke dalam> >pq(arr, arr+5);Catatan: Dalam C++, priority_queue sebenarnya disebut adaptor, bukan hanya wadah.
Kode Bandingkan Kustom
Memiliki semua nilai dalam antrian prioritas naik atau semua turun bukanlah satu-satunya pilihan untuk antrian prioritas. Misalnya, daftar 11 bilangan bulat untuk tumpukan maksimum adalah:
88, 86, 87, 84, 82, 79,74, 80, 81,, 64, 69
Nilai tertinggi adalah 88. Ini diikuti oleh dua angka: 86 dan 87, yang kurang dari 88. Angka-angka lainnya kurang dari tiga angka ini, tetapi tidak benar-benar berurutan. Ada dua sel kosong dalam daftar. Angka 84 dan 82 kurang dari 86. Angka 79 dan 74 kurang dari 87. Angka 80 dan 81 lebih kecil dari 84. Angka 64 dan 69 kurang dari 79.
Penempatan angka mengikuti kriteria max-heap – lihat nanti. Untuk menyediakan skema seperti itu untuk priority_queue, programmer harus menyediakan kode perbandingannya sendiri – lihat nanti.
Kesimpulan
A C++ priority_queue adalah antrian masuk pertama keluar pertama. fungsi anggota, dorongan(), menambahkan nilai baru ke dalam antrian. fungsi anggota, atas(), membaca nilai teratas dalam antrian. fungsi anggota, pop(), menghapus tanpa mengembalikan nilai teratas antrian. fungsi anggota, kosong(), memeriksa apakah antrian kosong. Namun, priority_queue berbeda dari antrian, dalam hal itu, mengikuti beberapa algoritma prioritas. Itu bisa menjadi yang terbesar, dari pertama hingga terakhir, atau paling tidak, dari pertama hingga terakhir. Kriteria (algoritma) juga dapat ditentukan oleh pemrogram.