C ++

Cara menggunakan C ++ Priority_queue?

Cara menggunakan C ++ Priority_queue?
Dalam C ++, antrian adalah struktur data senarai di mana elemen pertama yang dimasukkan ke 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 menghilangkan elemen pertama yang pernah didorong masuk. 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 nama std;

Ia merangkumi perpustakaan antrian ke dalam program.

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

Kandungan Artikel

  • Pengenalan - lihat di atas
  • Pembinaan Asas
  • Fungsi Anggota Penting
  • Fungsi Baris Keutamaan Lain
  • Data Rentetan
  • Pembinaan Baris Keutamaan Lain
  • Kesimpulannya

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 queueName;

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

keutamaan_queue pq;

atau

keutamaan_queue pq;

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

keutamaan_queue, bandingkan> pq;

Contoh contoh ini adalah:

keutamaan_queue, kurang > 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 > pq;

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

keutamaan_queue, lebih besar > 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 pq;
pq.tolak (10);
pq.tolak (30);
pq.tolak (20);
pq.tolak (50);
pq.tolak (40);

Priority_queue ini telah menerima 5 nilai integer dalam urutan 10, 30, 20, 50, 40. Sekiranya semua elemen ini keluar dari barisan keutamaan, maka elemen tersebut akan keluar mengikut 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 seterusnya, dan seterusnya. Ia kembali terbatal. Kod berikut menggambarkan ini:

keutamaan_queue, lebih besar > pq;
pq.tolak ('a'); pq.tolak ('c'); pq.tolak ('b'); pq.tolak ('e'); pq.tolak ('d');

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

Fungsi teratas ()
The pop () fungsi membuang 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, lebih besar > pq;
pq.tolak ('a'); pq.tolak ('c'); pq.tolak ('b'); pq.tolak ('e'); pq.tolak ('d');
char ch1 = pq.atas (); pq.pop ();
char ch2 = pq.atas (); pq.pop ();
char ch3 = pq.atas (); pq.pop ();
char ch4 = pq.atas (); pq.pop ();
char ch5 = pq.atas (); pq.pop ();
cout<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 (inti 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 pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.tolak (i1); pq.tolak (i2); pq.tolak (i3); pq.tolak (i4); pq.tolak (i5);
semasa (!pq.kosong ())

cout << pq.top() << ";
pq.pop ();

cout << '\n';

Fungsi Baris Keutamaan Lain

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

keutamaan_queue pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.tolak (i1); pq.tolak (i2); pq.tolak (i3); pq.tolak (i4); pq.tolak (i5);
int len ​​= pq.saiz ();
cout << 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 pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.tolak (i1); pq1.tolak (i2); pq1.tolak (i3); pq1.tolak (i4); pq1.tolak (i5);
keutamaan_queue pqA;
int it1 = 1; int itu2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.tolak (it1); pqA.tolak (it2); pqA.tolak (it3); pqA.tolak (it4); pqA.tolak (it5);
pq1.pertukaran (pqA);
semasa (!pq1.kosong ())

cout << pq1.top() << ";
pq1.pop ();
cout<<'\n';
semasa (!pqA.kosong ())

cout << pqA.top() << ";
pqA.pop ();
cout<<'\n';

Keluarannya adalah:

5 4 3 2 1
50 40 30 20 10

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

keutamaan_queue pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.tempat kerja (i1); pq1.tempat kerja (i2); pq1.tempat kerja (i3); pq1.tempat kerja (i4); pq1.tempat kerja (i5);
semasa (!pq1.kosong ())

cout << pq1.top() << ";
pq1.pop ();
cout<<'\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 ia akan membandingkan penunjuk dan bukan rentetan yang sebenarnya. Kod berikut menunjukkan bagaimana kelas rentetan digunakan:

#sertakan
keutamaan_queue pq1;
string s1 = string ("pen"), s2 = string ("pensil"), s3 = string ("buku latihan"), s4 = string ("buku teks"), s5 = string ("pembaris");
pq1.tolak (s1); pq1.tolak (s2); pq1.tolak (s3); pq1.tolak (s4); pq1.tolak (s5);
semasa (!pq1.kosong ())

cout << pq1.top() << " ";
pq1.pop ();
cout<<'\n';

Keluarannya adalah:

buku latihan pembaris pensel buku teks

Pembinaan Baris Keutamaan Lain

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

#sertakan
vektor vtr = 10, 30, 20, 50, 40;
keutamaan_queue pq (vtr.bermula (), vtr.akhir ());
semasa (!pq.kosong ())

cout << pq.top() << ";
pq.pop ();
cout<<'\n';

Keluarannya ialah: 50 40 30 20 10. Kali ini, header 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 membuat keutamaan nilai paling rendah, deklarasi untuk pembina adalah:

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

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

int arr [] = 10, 30, 20, 50, 40;
keutamaan_queue pq (arr, arr + 5);
semasa (!pq.kosong ())

cout << pq.top() << ";
pq.pop ();
cout<<'\n';

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

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

keutamaan_queue, lebih besar > 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 ialah 88. Ini diikuti oleh dua nombor: 86 dan 87, yang kurang dari 88. Angka selebihnya kurang daripada tiga nombor ini, tetapi tidak betul-betul teratur. Terdapat dua sel kosong dalam senarai. Angka 84 dan 82 kurang daripada 86. Angka 79 dan 74 kurang daripada 87. Nombor 80 dan 81 kurang daripada 84. Nombor 64 dan 69 kurang daripada 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 terakhir. Kriteria (algoritma) juga boleh ditentukan oleh pengaturcara.

Tambahkan isyarat Tetikus ke Windows 10 menggunakan alat percuma ini
Dalam beberapa tahun kebelakangan ini komputer dan sistem operasi telah banyak berkembang. Ada saat ketika pengguna harus menggunakan perintah untuk m...
Mengawal & menguruskan pergerakan tetikus antara beberapa monitor di Windows 10
Pengurus Tetikus Paparan Dwi membolehkan anda mengawal & mengkonfigurasi pergerakan tetikus antara beberapa monitor, dengan memperlahankan pergerakann...
WinMouse membolehkan anda menyesuaikan & meningkatkan pergerakan penunjuk tetikus pada PC Windows
Sekiranya anda ingin meningkatkan fungsi lalai penunjuk tetikus anda gunakan perisian percuma WinMouse. Ia menambah lebih banyak ciri untuk membantu a...