Kolejka priorytetowa C ++ z niestandardowym komparatorem

Kolejka priorytetowa C ++ z niestandardowym komparatorem
Kolejki priorytetowe są rzeczywiście unikalnym typem danych. Są one wspierane przez stosy (forma drzewa binarnego), ale zostały one wykorzystane podobnie jak kolejki. To, co odróżnia kolejkę priorytetową od zwykłej kolejki, byłaby to, że utrzymuje swój układ sortowania w O (logn), nawet przy dodawaniu lub usuwaniu nowych członków. Z podstawowymi typami danych, takimi jak liczby i ciągami, używanie kolejki priorytetowej wydaje się najprostsze. Kolejki priorytetowe dla spersonalizowanych typów są możliwe, podobnie jak możliwość konstruowania niestandardowego wzorca sortowania dla podstawowych rodzajów. Korzystając z kolejek priorytetowych, możesz użyć niestandardowego komparatora, takiego jak wektory zamawiania, aby opisać, w jaki sposób można sortować wpisy w kolejce priorytetowej. W C ++ zwykle kończy się to tylko strukturą. Jednak instrukcje Lambda są szybsze w budowie i umożliwiające dostęp do zmiennych poza zakresem (co jest złożone, aby upewnić się, że ze strukturami). W ramach tego przewodnika będziemy omawiać przykład kolejki priorytetowej z komparatorem klienta.

Przykład:

Zacznijmy od przykładu użycia kolejki priorytetowej z niestandardowym komparatorem w C++. Więc pociska końcowa musi zostać otwarta z Ctrl+alt+T krótki sposób. Plik C ++ musi być tworzony w skorupce za pomocą instrukcji „dotyk” Ubuntu. Jest to dość łatwe. Następnie ten plik musi zostać otwarty w ramach jakiegoś edytora, aby wykonać kod. Możesz mieć edytor VIM, SMS lub NANO. Używamy tutaj edytora „Nano” do szybkiej edycji i aktualizacji.

$ Touch kolejka.CC
$ nano kolejka.CC

Tak więc pusty plik C ++ zostanie otwarty na ekranie terminalu w edytorze Nano. Czas dodać biblioteki nagłówków na początku, aby nasz kod działał poprawnie. Dlatego z każdym nagłówkiem użyliśmy znaku „#include”. Nagłówek „iostream” służy do korzystania z strumienia wejściowego. Nagłówek „wektor” jest odrzucony w celu korzystania z struktury danych wektorowych. Nagłówek „UNOPORED_MAP” został użyty do utworzenia mapy dla wartości wektora w ilościach. Plik nagłówka „kolejki” ma na celu użycie kolejki priorytetowej i powiązanych z nimi funkcji danych. Rozpoczęliśmy metodę Main () Po standardowym wykorzystaniu przestrzeni nazw „STD”, rozpoczęliśmy metodę main (). Utworzyliśmy strukturę danych wektorowych o nazwie „kolor” typu ciągów, aby przechowywać wartości ciągów. Podczas gdy obiekt wektorowy „kolor” używa funkcji push_back (), aby dodać nazwy kolorów w wektorze, i.mi., Czerwony, zielony, niebieski, biały i czarny.

#włączać
#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

Cout << "Starting… \n";
wektor kolor;
kolor.push_back („czerwony”);
kolor.push_back („zielony”);
kolor.push_back („niebieski”);
kolor.push_back („biały”);
kolor.push_back („czarny”);

Po utworzeniu obiektu wektorowego musimy utworzyć strukturę mapy za pomocą słowa kluczowego „underporned_map”. Obiektem tej mapy jest „m” i zawiera parametry ciągów i liczb całkowitych. Mapa jest tworzona w celu powiązania ilości całkowitej z wektorem ciągów, więc wartość typu liczb całkowitych jest przypisywana do wartości ciągów „kolor” wektora.

UNOPORDED_MAPM;
m [„czerwony”] = 2;
m [„zielony”] = 4;
m [„niebieski”] = 6;
m [„biały”] = 8;
m [„czarny”] = 10;

Oto niestandardowy komparator zadeklarowany jako zmienna „CMP” ze słowem kluczowym „Auto.„Auto Słowo kluczowe służy do odzyskania wyniku dowolnego typu bez definiowania. Oświadczenie „jeśli” służy do sprawdzenia, czy ilość wartości lewej mapy jest równa ilości właściwej wartości mapy, czy nie. Jeśli tak, powróci, że znak lewej strony jest większy niż prawy boczny znak łańcucha do zmiennej „CMP”. Jeśli nie są równe, zwróci, że wartość ilości prawej strony jest większa niż wartość ilości lewej strony ciągu za pośrednictwem mapy. To sortuje ilość w kolejności malejącej, podczas gdy nazwa ciągu jest uporządkowana w kolejności rosnącej.

auto cmp = [&] (string & l, string & r)
if (m [le] == m [r])
return l> r;
return m [r]> m [l];
;

Teraz nadszedł czas, aby stworzyć kolejkę priorytetową i dodać wszystkie kolory wykorzystujące wektor. Tak więc kolejka priorytetowa została wygenerowana przy użyciu wektora typu ciągów, a typ deklaracji został ustawiony zgodnie z zmienną kompleksu. PQ jest obiektem kolejki priorytetowej. Pętla „dla” jest tutaj, aby popchnąć każdy kolor do kolejki priorytetowej „PQ” za pośrednictwem funkcji push ().

kolejka priorytetowa, DectType (cmp)> pq (cmp);
dla (const string & clr: color)
PQ.push (clr);

Pętla „While” jest nadal wykonywana, dopóki kolejka nie będzie pusta i dodaje każdy ciąg z niej do ciągu „CLR”. Ta szczególna wartość zostałaby wyskoczona i wyświetlana na skorcie. Nasz kod programu jest wypełniony tutaj i gotowy do wykonania.

chwila(!PQ.pusty())
String Fruit = PQ.szczyt();
PQ.Muzyka pop();
Cout << fruit << " " << m[fruit] << endl;

Cout << "Ending… \n";
powrót 0;

Kompilacja jest całkiem skuteczna. Co więcej, wszystkie wartości łańcuchowe wektora zostały wyświetlone na powładzie wraz z ich ilościami, które są mapowane przez „Mapa.„Widać, że zlecenie ilościowe schodzi w naszym przypadku.

$ g ++ kolejka.CC
$ ./A.na zewnątrz

Wniosek:

Chodziło o prosty przykład kolejki priorytetowej z niestandardowym komparatorem w C++. Omówiliśmy to szczegółowo w jednym przykładzie, zachowując prosty i najłatwiejszy sposób. Dodaliśmy kod w postaci fragmentów, które pomagają czytelnikom dobrze to zrozumieć.