Πώς να χρησιμοποιήσετε το C ++ Priority_queue;

How Use C Priority_queue



Στο C ++, μια ουρά είναι μια δομή δεδομένων λίστας όπου το πρώτο στοιχείο που μπαίνει στη λίστα είναι το πρώτο στοιχείο που αφαιρείται, όταν πρόκειται να πραγματοποιηθεί η αφαίρεση. Μια ουρά προτεραιότητας στο C ++ είναι παρόμοια, αλλά έχει κάποια σειρά. είναι το στοιχείο με τη μεγαλύτερη τιμή που αφαιρείται πρώτα. Η ουρά προτεραιότητας μπορεί ακόμα να διαμορφωθεί έτσι ώστε να είναι το στοιχείο με τη μικρότερη τιμή που θα καταργηθεί πρώτο. Κάθε ουρά πρέπει να έχει τουλάχιστον το Σπρώξτε() λειτουργία και το ποπ () λειτουργία. ο Σπρώξτε() η λειτουργία προσθέτει ένα νέο στοιχείο στο πίσω μέρος. Για την κανονική ουρά, το ποπ () Η συνάρτηση αφαιρεί το πρώτο στοιχείο που εισήχθη ποτέ. Για την ουρά προτεραιότητας, το ποπ () Η συνάρτηση αφαιρεί το στοιχείο με την υψηλότερη προτεραιότητα, η οποία θα μπορούσε να είναι η μεγαλύτερη ή η μικρότερη, ανάλογα με το σχήμα παραγγελίας.

Για να χρησιμοποιήσετε το C ++ priorit_queue, το πρόγραμμα θα πρέπει να ξεκινά με κώδικα όπως:







#περιλαμβάνω
#περιλαμβάνω
χρησιμοποιώντας ονομαστικου χωρουώρες?

Περιλαμβάνει τη βιβλιοθήκη ουράς στο πρόγραμμα.



Για να συνεχίσει να διαβάζει, ο αναγνώστης θα έπρεπε να είχε βασικές γνώσεις C ++.



Περιεχόμενο άρθρου

Βασική Κατασκευή

Η δομή δεδομένων πρέπει να δημιουργηθεί πρώτα για να μπορέσει να χρησιμοποιηθεί. Η κατασκευή εδώ σημαίνει την άμεση προβολή ενός αντικειμένου από την κλάση ουράς της βιβλιοθήκης. Το αντικείμενο ουράς πρέπει στη συνέχεια να έχει ένα όνομα που του έχει δοθεί από τον προγραμματιστή. Η απλούστερη σύνταξη για τη δημιουργία ουράς προτεραιότητας είναι:





σειρά προτεραιότητας<τύπος>>queueName?

Με αυτήν τη σύνταξη, αφαιρείται πρώτα η μεγαλύτερη τιμή. Ένα παράδειγμα της κατάστασης είναι:

σειρά προτεραιότητας<int>>pq?

ή



σειρά προτεραιότητας<απανθρακώνω>>pq?

Το διάνυσμα και το deque είναι δύο δομές δεδομένων σε C ++. Μπορεί να δημιουργηθεί ένα προτεραιότητας_κείμενο με οποιοδήποτε από αυτά. Η σύνταξη για τη δημιουργία ουράς προτεραιότητας από τη διανυσματική δομή είναι:

σειρά προτεραιότητας<τύπος, διάνυσμα<ίδιου τύπου>>, συγκρίνω>>pq?

Ένα παράδειγμα αυτής της κατάστασης είναι:

σειρά προτεραιότητας<int, διάνυσμα<int>>, πιο λιγο<int>> >>pq?

Παρατηρήστε το κενό μεταξύ> και> στο τέλος της δήλωσης. Αυτό γίνεται για να αποφευχθεί η σύγχυση με το >>. Ο προεπιλεγμένος κώδικας σύγκρισης είναι μικρότερος, πράγμα που σημαίνει ότι η μεγαλύτερη και όχι απαραίτητα η πρώτη τιμή θα καταργηθεί πρώτα. Έτσι, η δήλωση δημιουργίας μπορεί απλά να γραφτεί ως:

σειρά προτεραιότητας<int, διάνυσμα<int>> >>pq?

Εάν η μικρότερη τιμή πρόκειται να αφαιρεθεί πρώτα, τότε η δήλωση πρέπει να είναι:

σειρά προτεραιότητας<int, διάνυσμα<int>>, μεγαλύτερη<int>> >>pq?

Σημαντικές λειτουργίες μελών

Λειτουργία push ()
Αυτή η συνάρτηση σπρώχνει μια τιμή, που είναι το όρισμα της, στον κύκλο προτεραιότητας. Επιστρέφει άκυρο. Ο παρακάτω κώδικας το δείχνει αυτό:

σειρά προτεραιότητας<int>>pq?

pqΣπρώξτε(10)?
pqΣπρώξτε(30)?
pqΣπρώξτε(είκοσι)?
pqΣπρώξτε(πενήντα)?
pqΣπρώξτε(40)?

Αυτός ο κατάλογος προτεραιότητας έχει λάβει 5 ακέραιες τιμές της τάξης των 10, 30, 20, 50, 40. Εάν όλα αυτά τα στοιχεία πρέπει να βγουν από την ουρά προτεραιότητας, τότε θα βγουν με τη σειρά των 50, 40, 30, 20, 10.

Η λειτουργία pop ()
Αυτή η συνάρτηση αφαιρεί από το priority_queue την τιμή με την υψηλότερη προτεραιότητα. Εάν ο κώδικας σύγκρισης είναι μεγαλύτερος, τότε θα αφαιρέσει το στοιχείο με τη μικρότερη τιμή. Εάν κληθεί ξανά, αφαιρεί το επόμενο στοιχείο με τη μικρότερη τιμή του υπολοίπου. καλείται ξανά, αφαιρεί την επόμενη μικρότερη τιμή που υπάρχει, και ούτω καθεξής. Επιστρέφει άκυρο. Ο παρακάτω κώδικας το δείχνει αυτό:

σειρά προτεραιότητας<απανθρακώνω, διάνυσμα<απανθρακώνω>>, μεγαλύτερη<int>> >>pq?
pqΣπρώξτε('προς το')?pqΣπρώξτε('ντο')?pqΣπρώξτε('σι')?pqΣπρώξτε('Και')?pqΣπρώξτε('ρε')?

Σημειώστε ότι για να καλέσετε μια συνάρτηση μέλους, το όνομα του αντικειμένου πρέπει να ακολουθείται από μια τελεία και στη συνέχεια τη συνάρτηση.

Λειτουργία κορυφής ()
ο ποπ () η συνάρτηση αφαιρεί την επόμενη τιμή ύψιστης προτεραιότητας, αλλά δεν την επιστρέφει, όπως ποπ () είναι μια κενή συνάρτηση. Χρησιμοποιήστε το μπλουζα() συνάρτηση για να γνωρίζουμε την τιμή της υψηλότερης προτεραιότητας που πρέπει να αφαιρεθεί στη συνέχεια. ο μπλουζα() η συνάρτηση επιστρέφει ένα αντίγραφο της τιμής της υψηλότερης προτεραιότητας στο prior_queue. Ο παρακάτω κώδικας, όπου η επόμενη τιμή υψηλότερης προτεραιότητας είναι η μικρότερη τιμή, το δείχνει αυτό

σειρά προτεραιότητας<απανθρακώνω, διάνυσμα<απανθρακώνω>>, μεγαλύτερη<int>> >>pq?
pqΣπρώξτε('προς το')?pqΣπρώξτε('ντο')?pqΣπρώξτε('σι')?pqΣπρώξτε('Και')?pqΣπρώξτε('ρε')?
απανθρακώνωch1=pqμπλουζα()?pqκρότος()?
απανθρακώνωch2=pqμπλουζα()?pqκρότος()?
απανθρακώνωch3=pqμπλουζα()?pqκρότος()?
απανθρακώνωch4=pqμπλουζα()?pqκρότος()?
απανθρακώνωch5=pqμπλουζα()?pqκρότος()?

κόστος<<ch1<<''<<ch2<<''<<ch3<<''<<ch4<<''<<ch5<<' n'?

Η έξοδος είναι ‘a’ ‘b’ ‘c’ ‘d’ ‘e’.

Η κενή συνάρτηση ()
Εάν ένας προγραμματιστής χρησιμοποιεί το μπλουζα() Λειτουργεί σε ένα κενό πεδίο προτεραιότητας, μετά την επιτυχή μεταγλώττιση, θα λάβει ένα μήνυμα σφάλματος όπως:

σφάλμα κατάτμησης(πυρήνας ντάμπινγκ)

Έτσι, ελέγχετε πάντα αν η ουρά προτεραιότητας δεν είναι κενή πριν χρησιμοποιήσετε το μπλουζα() λειτουργία. ο αδειάζω() η συνάρτηση μελών επιστρέφει ένα bool, true, εάν η ουρά είναι κενή και false εάν η ουρά δεν είναι κενή. Ο παρακάτω κώδικας το δείχνει αυτό:

σειρά προτεραιότητας<int>>pq?
inti1= 10? inti2= 30? inti3= είκοσι? inti4= πενήντα? inti5= 40?
pqΣπρώξτε(i1)?pqΣπρώξτε(i2)?pqΣπρώξτε(i3)?pqΣπρώξτε(i4)?pqΣπρώξτε(i5)?

ενώ(!pqαδειάζω())
{
κόστος <<pqμπλουζα() << ''?
pqκρότος()?
}
κόστος << ' n'?

Άλλες λειτουργίες ουράς προτεραιότητας

Το μέγεθος () Λειτουργία
Αυτή η συνάρτηση επιστρέφει το μήκος της ουράς προτεραιότητας, όπως φαίνεται από τον ακόλουθο κώδικα:

σειρά προτεραιότητας<int>>pq?
inti1= 10? inti2= 30? inti3= είκοσι? inti4= πενήντα? inti5= 40?
pqΣπρώξτε(i1)?pqΣπρώξτε(i2)?pqΣπρώξτε(i3)?pqΣπρώξτε(i4)?pqΣπρώξτε(i5)?

intλεν=pqΜέγεθος()?
κόστος <<λεν<< ' n'?

Η έξοδος είναι 5.

Η συνάρτηση swap ()
Εάν δύο προτεραιότητες είναι του ίδιου τύπου και μεγέθους, τότε μπορούν να αλλάξουν με αυτήν τη συνάρτηση, όπως δείχνει ο ακόλουθος κώδικας:

σειρά προτεραιότητας<int>>pq1?
inti1= 10? inti2= 30? inti3= είκοσι? inti4= πενήντα? inti5= 40?
pq1.Σπρώξτε(i1)?pq1.Σπρώξτε(i2)?pq1.Σπρώξτε(i3)?pq1.Σπρώξτε(i4)?pq1.Σπρώξτε(i5)?

σειρά προτεραιότητας<int>>pqA?
intit1= 1? intit2= 3? intit3= 2? intit4= 5? intit5= 4?
pqA.Σπρώξτε(it1)?pqA.Σπρώξτε(it2)?pqA.Σπρώξτε(it3)?pqA.Σπρώξτε(it4)?pqA.Σπρώξτε(it5)?

pq1.ανταλαγή(pqA)?

ενώ(!pq1.αδειάζω())
{
κόστος <<pq1.μπλουζα() << ''?
pq1.κρότος()?
} κόστος<<' n'?

ενώ(!pqA.αδειάζω())
{
κόστος <<pqA.μπλουζα() << ''?
pqA.κρότος()?
} κόστος<<' n'?

Η έξοδος είναι:

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

The emplace () Fuction
ο emplace () η λειτουργία είναι παρόμοια με τη λειτουργία ώθησης. Ο παρακάτω κώδικας το δείχνει αυτό:

σειρά προτεραιότητας<int>>pq1?
inti1= 10? inti2= 30? inti3= είκοσι? inti4= πενήντα? inti5= 40?
pq1.εγκαθιστώ(i1)?pq1.εγκαθιστώ(i2)?pq1.εγκαθιστώ(i3)?pq1.εγκαθιστώ(i4)?pq1.εγκαθιστώ(i5)?

ενώ(!pq1.αδειάζω())
{
κόστος <<pq1.μπλουζα() << ''?
pq1.κρότος()?
} κόστος<<' n'?

Η έξοδος είναι:

50 40 30 20 10 10

Στοιχεία συμβολοσειράς

Κατά τη σύγκριση συμβολοσειρών, πρέπει να χρησιμοποιείται η κλάση συμβολοσειράς και όχι η άμεση χρήση των κυριολεκτικών συμβολοσειρών, επειδή θα συνέκρινε δείκτες και όχι τις πραγματικές συμβολοσειρές. Ο παρακάτω κώδικας δείχνει πώς χρησιμοποιείται η κλάση συμβολοσειράς:

#περιλαμβάνω
σειρά προτεραιότητας<σειρά>>pq1?
συμβολοσειρά s1=σειρά('στυλό'), s2=σειρά('μολύβι'), s3=σειρά('βιβλίο ασκήσεων'), s4=σειρά('βιβλίο βιβλίων'), s5=σειρά('κυβερνήτης')?

pq1.Σπρώξτε(s1)?pq1.Σπρώξτε(s2)?pq1.Σπρώξτε(s3)?pq1.Σπρώξτε(s4)?pq1.Σπρώξτε(s5)?
ενώ(!pq1.αδειάζω())
{
κόστος <<pq1.μπλουζα() << ''?
pq1.κρότος()?
} κόστος<<' n'?

Η έξοδος είναι:

& emsp; βιβλίο βιβλίων & emsp; χάρακας & emsp; μολύβι & emsp; στυλό & emsp; τετράδιο ασκήσεων

Άλλες κατασκευές ουράς προτεραιότητας

Ρητή δημιουργία από ένα διάνυσμα
Μια ουρά προτεραιότητας μπορεί να δημιουργηθεί ρητά από ένα διάνυσμα, όπως δείχνει ο ακόλουθος κώδικας:

#περιλαμβάνω
διάνυσμα<int>>vtr= {10,30,είκοσι,πενήντα,40}?

σειρά προτεραιότητας<int>>pq(vtrνα αρχίσει(), vtr.τέλος())?

ενώ(!pqαδειάζω())
{
κόστος <<pqμπλουζα() << ''?
pqκρότος()?
} κόστος<<' n'?

Η έξοδος είναι: 50 40 30 20 10. Αυτή τη φορά, πρέπει να συμπεριληφθεί και η κεφαλίδα του διανύσματος. Τα ορίσματα για τη συνάρτηση του κατασκευαστή λαμβάνουν τους δείκτες έναρξης και λήξης του διανύσματος. Ο τύπος δεδομένων για το διάνυσμα και ο τύπος δεδομένων για τη διαδρομή προτεραιότητας πρέπει να είναι οι ίδιοι.

Προκειμένου να δοθεί η μικρότερη τιμή ως προτεραιότητα, η δήλωση για τον κατασκευαστή θα είναι:

σειρά προτεραιότητας<int, διάνυσμα<int>>, μεγαλύτερη>>int>> >>pq(vtrνα αρχίσει(), vtr.τέλος())?

Ρητή δημιουργία από έναν πίνακα
Μια ουρά προτεραιότητας μπορεί να δημιουργηθεί ρητά από έναν πίνακα, όπως δείχνει ο ακόλουθος κώδικας:

intarr[] = {10,30,είκοσι,πενήντα,40}?

σειρά προτεραιότητας<int>>pq(arr, arr+5)?

ενώ(!pqαδειάζω())
{
κόστος <<pqμπλουζα() << ''?
pqκρότος()?
} κόστος<<' n'?

Η έξοδος είναι: 50 40 30 20 10. Τα ορίσματα για τη συνάρτηση του κατασκευαστή λαμβάνουν τους δείκτες έναρξης και λήξης του πίνακα. Το arr επιστρέφει το δείκτη έναρξης, το arr+5 επιστρέφει τον δείκτη μόλις πέρα ​​από τον πίνακα και το 5 είναι το μέγεθος του πίνακα. Ο τύπος δεδομένων για τον πίνακα και ο τύπος δεδομένων για τον κατάλογο προτεραιότητας πρέπει να είναι ο ίδιος.

Προκειμένου να δοθεί η μικρότερη τιμή ως προτεραιότητα, η δήλωση για τον κατασκευαστή θα είναι:

σειρά προτεραιότητας<int, διάνυσμα<int>>, μεγαλύτερη<int>> >>pq(arr, arr+5)?

Σημείωση: Στο C ++, ο κατάλογος προτεραιότητας ονομάζεται στην πραγματικότητα προσαρμογέας και όχι μόνο ένα κοντέινερ.

Κωδικός προσαρμοσμένης σύγκρισης

Το να ανεβαίνουν ή να κατεβαίνουν όλες οι τιμές στην ουρά προτεραιότητας δεν είναι η μόνη επιλογή για την ουρά προτεραιότητας. Για παράδειγμα, μια λίστα με 11 ακέραιους αριθμούς για μέγιστο σωρό είναι:

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

Η υψηλότερη τιμή είναι 88. Ακολουθούν δύο αριθμοί: 86 και 87, οι οποίοι είναι μικρότεροι από 88. Οι υπόλοιποι αριθμοί είναι μικρότεροι από αυτούς τους τρεις αριθμούς, αλλά όχι πραγματικά με τη σειρά. Υπάρχουν δύο κενά κελιά στη λίστα. Οι αριθμοί 84 και 82 είναι μικρότεροι από 86. Οι αριθμοί 79 και 74 είναι μικρότεροι από 87. Οι αριθμοί 80 και 81 είναι λιγότεροι από 84. Οι αριθμοί 64 και 69 είναι λιγότεροι από 79.

Η τοποθέτηση των αριθμών ακολουθεί τα κριτήρια μέγιστου σωρού-δείτε αργότερα. Προκειμένου να παράσχει ένα τέτοιο σχήμα για τη σειρά προτεραιότητας, ο προγραμματιστής πρέπει να παράσχει τον δικό του κωδικό σύγκρισης - δείτε αργότερα.

συμπέρασμα

Μια σειρά προτεραιότητας C ++ είναι μια ουρά πρώτης-πρώτης-εξόδου. Η λειτουργία μέλους, Σπρώξτε(), προσθέτει μια νέα τιμή στην ουρά. Η λειτουργία μέλους, μπλουζα(), διαβάζει την κορυφαία τιμή στην ουρά. Η λειτουργία μέλους, ποπ (), καταργεί χωρίς να επιστρέψει την κορυφαία τιμή της ουράς. Η λειτουργία μέλους, αδειάζω(), ελέγχει αν η ουρά είναι κενή. Ωστόσο, η σειρά προτεραιότητας διαφέρει από την ουρά, διότι ακολουθεί κάποιον αλγόριθμο προτεραιότητας. Μπορεί να είναι το καλύτερο, από το πρώτο στο τελευταίο, ή το λιγότερο, από το πρώτο στο τελευταίο. Τα κριτήρια (αλγόριθμος) μπορούν επίσης να καθοριστούν από τον προγραμματιστή.