C ++

Hur man använder C ++ Priority_queue?

Hur man använder C ++ Priority_queue?
I C ++ är en kö en listdatastruktur där det första elementet som ska placeras i listan är det första elementet som ska tas bort när borttagningen ska ske. En prioritetskö i C ++ är liknande, men har viss ordning; det är elementet med det största värdet som tas bort först. Prioritetskön kan fortfarande konfigureras så att det är det element som har minst värde som tas bort först. Varje kö måste ha minst skjuta på() funktion och pop() fungera. De skjuta på() -funktionen lägger till ett nytt element på baksidan. För den normala köen pop() funktionen tar bort det första elementet som någonsin tryckts in. För prioritetskön är pop() funktionen tar bort elementet med högsta prioritet, vilket kan vara det största eller minsta, beroende på beställningsschemat.

För att kunna använda C ++ -prioritetsvärdet bör programmet börja med kod som:

#omfatta
#omfatta
använder namnrymd std;

Det inkluderar köbiblioteket i programmet.

För att fortsätta läsa borde läsaren ha haft grundläggande kunskaper om C++.

Artikelinnehåll

  • Inledning - se ovan
  • Grundläggande konstruktion
  • Viktiga medlemsfunktioner
  • Andra prioriterade köfunktioner
  • Strängdata
  • Andra prioriterade kökonstruktioner
  • Slutsats

Grundläggande konstruktion

Datastrukturen måste konstrueras först innan den kan användas. Konstruktion här innebär att man startar ett objekt från bibliotekets köklass. Köobjektet måste då ha ett namn som ges av programmeraren. Den enklaste syntaxen för att skapa en prioritetskö är:

prioritets_kö könamn;

Med denna syntax tas det största värdet bort först. Ett exempel på instantiering är:

prioritets_kö pq;

eller

prioritets_kö pq;

Vektorn och deken är två datastrukturer i C++. En prioritets_kö kan skapas med någon av dem. Syntaxen för att skapa en prioritetskö från vektorn är:

prioritets_kö, jämför> pq;

Ett exempel på denna instantiering är:

prioritets_kö, mindre > pq;

Lägg märke till klyftan mellan> och> i slutet av deklarationen. Detta för att förhindra förvirring med >>. Standardjämförelsekoden är ”mindre”, Vilket betyder det största och inte nödvändigtvis det första värdet, skulle tas bort först. Så skapande uttalandet kan helt enkelt skrivas som:

prioritets_kö > pq;

Om det minsta värdet ska tas bort först måste uttalandet vara:

prioritets_kö, större > pq;

Viktiga medlemsfunktioner

Push () -funktionen
Denna funktion skjuter ett värde, som är dess argument, in i prioritet_kö. Det återgår ogiltigt. Följande kod illustrerar detta:

prioritets_kö pq;
pq.tryck (10);
pq.tryck (30);
pq.tryck (20);
pq.tryck (50);
pq.tryck (40);

Denna prioritetskö har fått 5 heltal i storleksordningen 10, 30, 20, 50, 40. Om alla dessa element ska poppas ut ur prioritetskön kommer de i storleksordningen 50, 40, 30, 20, 10.

Pop () -funktionen
Denna funktion tar bort värdet med högsta prioritet från prioritet_kön. Om jämförelsekoden är ”större”, Då tar det bort elementet med det minsta värdet. Om den anropas igen tar den bort nästa element med det minsta värdet av resten; kallas igen tar det bort det näst minsta värdet nu, och så vidare. Det återgår ogiltigt. Följande kod illustrerar detta:

prioritets_kö, större > pq;
pq.tryck ('a'); pq.tryck ('c'); pq.tryck ('b'); pq.tryck ('e'); pq.tryck ('d');

Observera att för att anropa en medlemsfunktion måste namnet på objektet följas av en punkt och sedan funktionen.

Toppfunktionen ()
De pop() funktionen tar bort nästa värde med högsta prioritet, men returnerar det inte, som pop() är en ogiltig funktion. Använd topp() funktion för att känna till värdet på högsta prioritet som måste tas bort nästa. De topp() funktionen returnerar en kopia av värdet med högsta prioritet i prioritet_kö. Följande kod, där nästa värde med högsta prioritet är det minsta värdet, illustrerar detta

prioritets_kö, större > pq;
pq.tryck ('a'); pq.tryck ('c'); pq.tryck ('b'); pq.tryck ('e'); pq.tryck ('d');
char ch1 = pq.topp(); pq.pop();
char ch2 = pq.topp(); pq.pop();
char ch3 = pq.topp(); pq.pop();
char ch4 = pq.topp(); pq.pop();
char ch5 = pq.topp(); pq.pop();
cout<Utgången är 'a "b" c "d" e'.

Den tomma () funktionen
Om en programmerare använder topp() funktion på en tom prioritet_kö, efter den lyckade sammanställningen, skulle han få ett felmeddelande som:

Segmenteringsfel (kärna dumpad)

Så kontrollera alltid om prioritetskön inte är tom innan du använder topp() fungera. De tömma() medlemsfunktionen returnerar en bool, sant, om kön är tom och falsk om kön inte är tom. Följande kod illustrerar detta:

prioritets_kö pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.tryck (i1); pq.tryck (i2); pq.tryck (i3); pq.tryck (i4); pq.tryck (i5);
medan(!pq.tömma())

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

cout << '\n';

Andra prioriterade köfunktioner

Funktionen storlek ()
Den här funktionen returnerar längden på prioritetskön, som följande kod illustrerar:

prioritets_kö pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.tryck (i1); pq.tryck (i2); pq.tryck (i3); pq.tryck (i4); pq.tryck (i5);
int len ​​= pq.storlek();
cout << len << '\n';

Utgången är 5.

Swap-funktionen ()
Om två prioritetskövlar är av samma typ och storlek kan de bytas ut med den här funktionen, som följande kod visar:

prioritets_kö pql;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.tryck (i1); pq1.tryck (i2); pq1.tryck (i3); pq1.tryck (i4); pq1.tryck (i5);
prioritets_kö pqA;
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.tryck (it1); pqA.tryck (it2); pqA.tryck (it3); pqA.tryck (it4); pqA.tryck (it5);
pq1.swap (pqA);
medan(!pq1.tömma())

cout << pq1.top() << ";
pq1.pop();
cout<<'\n';
medan(!pqA.tömma())

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

Utgången är:

5 4 3 2 1
50 40 30 20 10

Emplace () Fuction
De emplace () funktionen liknar push-funktionen. Följande kod illustrerar detta:

prioritets_kö pql;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.emplace (i1); pq1.emplace (i2); pq1.emplace (i3); pq1.emplace (i4); pq1.emplace (i5);
medan(!pq1.tömma())

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

Utgången är:

50 40 30 20 10

Strängdata

Vid jämförelse av strängar bör strängklassen användas och inte direkt användning av stränglitteralerna eftersom den skulle jämföra pekare och inte de faktiska strängarna. Följande kod visar hur strängklassen används:

#omfatta
prioritets_kö pql;
sträng s1 = sträng ("penna"), s2 = sträng ("penna"), s3 = sträng ("övningsbok"), s4 = sträng ("textbok"), s5 = sträng ("linjal");
pq1.tryck (s1); pq1.tryck (s2); pq1.tryck (s3); pq1.tryck (s4); pq1.tryck (s5);
medan(!pq1.tömma())

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

Utgången är:

textbok linjal penna penna övning bok

Andra prioriterade kökonstruktioner

Explicit skapande från en vektor
En prioritetskö kan skapas uttryckligen från en vektor som följande kod visar:

#omfatta
vektor vtr = 10, 30, 20, 50, 40;
prioritets_kö pq (vtr.börja (), vtr.slutet());
medan(!pq.tömma())

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

Utgången är: 50 40 30 20 10. Den här gången måste också vektorhuvudet inkluderas. Argumenten för konstruktörfunktionen tar start- och slutpekarna för vektorn. Datatypen för vektorn och datatypen för prioritet_kö måste vara densamma.

För att prioritera det minsta värdet skulle deklarationen för konstruktören vara:

prioritets_kö, större> int>> pq (vtr.börja (), vtr.slutet());

Explicit skapande från en matris
En prioritetskö kan skapas uttryckligen från en matris som följande kod visar:

int arr [] = 10, 30, 20, 50, 40;
prioritets_kö pq (arr, arr + 5);
medan(!pq.tömma())

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

Utgången är: 50 40 30 20 10. Argumenten för konstruktorfunktionen tar start- och slutpekarna för matrisen. arr returnerar startpekaren, "arr + 5" returnerar pekaren precis förbi arrayen, och 5 är storleken på arrayen. Datatypen för matrisen och datatypen för prioritet_kö måste vara densamma.

För att prioritera det minsta värdet skulle deklarationen för konstruktören vara:

prioritets_kö, större > pq (arr, arr + 5);

Obs! I C ++ kallas prioritetsvärdet faktiskt en adapter, inte bara en container.

Anpassad jämförkod

Att ha alla värden i prioritetskön stigande eller alla fallande är inte det enda alternativet för prioritetskön. Till exempel är en lista med 11 heltal för en maximal höjd:

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

Det högsta värdet är 88. Detta följs av två siffror: 86 och 87, som är mindre än 88. Resten av siffrorna är mindre än dessa tre siffror, men egentligen inte i ordning. Det finns två tomma celler i listan. Siffrorna 84 och 82 är mindre än 86. Siffrorna 79 och 74 är mindre än 87. Siffrorna 80 och 81 är mindre än 84. Siffrorna 64 och 69 är mindre än 79.

Placeringen av siffrorna följer max-heap-kriterierna - se senare. För att kunna tillhandahålla ett sådant schema för prioritetskön måste programmeraren tillhandahålla sin egen jämförelsekod - se senare.

Slutsats

En C ++ -prioritetskö är en först-in-först-ut-kö. Medlemmens funktion, skjuta på(), lägger till ett nytt värde i kön. Medlemmens funktion, topp(), läser toppvärdet i kön. Medlemmens funktion, pop(), tar bort utan att köens toppvärde returneras. Medlemmens funktion, tömma(), kontrollerar om kön är tom. Prioritetskön skiljer sig dock från kön, eftersom den följer någon prioritetsalgoritm. Det kan vara störst, från första till sista, eller minst, från första till sista. Kriterierna (algoritm) kan också programmerardefinieras.

Mus Markören hoppar eller rör sig slumpmässigt när du skriver in Windows 10
Markören hoppar eller rör sig slumpmässigt när du skriver in Windows 10
Om du upptäcker att muspekaren hoppar eller rör sig på egen hand, automatiskt, slumpmässigt när du skriver in Windows-bärbar dator eller dator, kan nå...
Mus Så här vänder du mus- och styrplattans rullningsriktning i Windows 10
Så här vänder du mus- och styrplattans rullningsriktning i Windows 10
Mus och Pekplattas gör inte bara datoranvändning lättare men effektivare och mindre tidskrävande. Vi kan inte föreställa oss ett liv utan dessa enhete...
Mus Så här ändrar du muspekare och markörstorlek, färg och schema på Windows 10
Så här ändrar du muspekare och markörstorlek, färg och schema på Windows 10
Muspekaren och markören i Windows 10 är mycket viktiga aspekter av operativsystemet. Detta kan också sägas för andra operativsystem, så i sanning är d...