C ++

Как да използвам C ++ Priority_queue?

Как да използвам C ++ Priority_queue?
В C ++ опашката е структура от данни на списъка, където първият елемент, който се поставя в списъка, е първият елемент, който трябва да бъде премахнат, когато трябва да се извърши премахването. Опашката за приоритет в C ++ е подобна, но има известна подредба; това е елементът с най-голяма стойност, който се премахва първо. Приоритетната опашка все още може да бъде конфигурирана така, че първо да се премахне елементът с най-малка стойност. Всяка опашка трябва да има поне натиснете () функция и поп () функция. The натиснете () функция добавя нов елемент отзад. За нормалната опашка, поп () функция премахва първия елемент, въведен някога. За опашката с приоритет, поп () функция премахва елемента с най-висок приоритет, който може да бъде най-големият или най-малкият, в зависимост от схемата за поръчка.

За да използва C ++ priority_queue, програмата трябва да започне с код като:

#include
#include
използване на пространство от имена std;

Той включва библиотеката на опашките в програмата.

За да продължи да чете, читателят трябваше да има основни познания по C++.

Съдържание на статията

  • Въведение - вижте по-горе
  • Основна конструкция
  • Важни функции на членовете
  • Други функции за приоритетна опашка
  • Низови данни
  • Други конструкции на приоритетни опашки
  • Заключение

Основна конструкция

Структурата на данните трябва да се изгради първо, преди да може да се използва. Конструкцията тук означава създаване на екземпляр на обект от класа на опашката на библиотеката. След това обектът на опашката трябва да има име, дадено му от програмиста. Най-простият синтаксис за създаване на приоритетна опашка е:

приоритетна_черта queueName;

С този синтаксис първо се премахва най-голямата стойност. Пример за екземпляра е:

приоритетна_черта pq;

или

приоритетна_черта pq;

Векторът и deque са две структури от данни в C++. С всеки от тях може да се създаде приоритетна_опашка. Синтаксисът за създаване на приоритетна опашка от векторната структура е:

приоритетна_черта, сравни> pq;

Пример за тази инстанция е:

приоритетна_черта, по-малко > pq;

Забележете разликата между> и> в края на декларацията. Това е, за да се предотврати объркване с >>. Кодът за сравнение по подразбиране е „по-малко”, Което означава най-голямата, а не непременно първата стойност, ще бъде премахната първо. И така, изявлението за създаване може просто да бъде написано като:

приоритетна_черта > pq;

Ако първо се премахва най-малката стойност, тогава изразът трябва да бъде:

приоритетна_черта, по-голяма > pq;

Важни функции на членовете

Функцията push ()
Тази функция изтласква стойност, която е нейният аргумент, в приоритетната_черта. Връща се празно. Следният код илюстрира това:

приоритетна_черта pq;
pq.тласък (10);
pq.тласък (30);
pq.тласък (20);
pq.тласък (50);
pq.тласък (40);

Тази приоритетна_черта е получила 5 целочислени стойности от порядъка на 10, 30, 20, 50, 40. Ако всички тези елементи трябва да бъдат извадени от приоритетната опашка, те ще излязат в порядъка на 50, 40, 30, 20, 10.

Функцията pop ()
Тази функция премахва от prior_queue стойността с най-висок приоритет. Ако кодът за сравнение е „по-голям”, Тогава ще премахне елемента с най-малката стойност. Ако бъде извикан отново, той премахва следващия елемент с най-малката стойност на останалите; извикан отново, той премахва следващата най-малка налична стойност и т.н. Връща се празно. Следният код илюстрира това:

приоритетна_черта, по-голяма > pq;
pq.натиснете ('a'); pq.натиснете ('c'); pq.натиснете ('b'); pq.натиснете ('e'); pq.натиснете ('d');

Обърнете внимание, че за да се извика функция член, името на обекта трябва да бъде последвано от точка и след това функцията.

Най-горната () функция
The поп () функция премахва следващата стойност с най-висок приоритет, но не я връща като поп () е функция празнота. Използвай Горна част() функция, за да се знае стойността на най-високия приоритет, която трябва да бъде премахната следващата. The Горна част() функция връща копие на стойността с най-висок приоритет в приоритетната_черта. Следният код, където следващата стойност с най-висок приоритет е най-малката стойност, илюстрира това

приоритетна_черта, по-голяма > pq;
pq.натиснете ('a'); pq.натиснете ('c'); pq.натиснете ('b'); pq.натиснете ('e'); pq.бутон ('d');
char ch1 = pq.Горна част(); pq.поп ();
char ch2 = pq.Горна част(); pq.поп ();
char ch3 = pq.Горна част(); pq.поп ();
char ch4 = pq.Горна част(); pq.поп ();
char ch5 = pq.Горна част(); pq.поп ();
Cout<Изходът е "a" b "c" d "e '.

Функцията празен ()
Ако програмист използва Горна част() функция на празна приоритетна_черта, след успешната компилация той ще получи съобщение за грешка като:

Грешка в сегментирането (изхвърлено ядро)

Така че, винаги проверявайте дали приоритетната опашка не е празна, преди да използвате Горна част() функция. The празен () член-функция връща bool, true, ако опашката е празна, и false, ако опашката не е празна. Следният код илюстрира това:

приоритетна_черта pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.натискане (i1); pq.натискане (i2); pq.натискане (i3); pq.натискане (i4); pq.натискане (i5);
докато(!pq.празен ())

Cout << pq.top() << ";
pq.поп ();

Cout << '\n';

Други функции за приоритетна опашка

Функция за размер ()
Тази функция връща дължината на приоритетната опашка, както илюстрира следният код:

приоритетна_черта pq;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq.натискане (i1); pq.натискане (i2); pq.натискане (i3); pq.натискане (i4); pq.натискане (i5);
int len ​​= pq.размер ();
Cout << len << '\n';

Изходът е 5.

Функцията за размяна ()
Ако две приоритетни_опашки са от един и същи тип и размер, тогава те могат да бъдат заменени от тази функция, както показва следният код:

приоритетна_черта pq1;
int i1 = 10; int i2 = 30; int i3 = 20; int i4 = 50; int i5 = 40;
pq1.натискане (i1); pq1.натискане (i2); pq1.натискане (i3); pq1.натискане (i4); pq1.натискане (i5);
приоритетна_черта pqA;
int it1 = 1; int it2 = 3; int it3 = 2; int it4 = 5; int it5 = 4;
pqA.натиснете (it1); pqA.натиснете (it2); pqA.натиснете (it3); pqA.натиснете (it4); pqA.натиснете (it5);
pq1.суап (pqA);
докато(!pq1.празен ())

Cout << pq1.top() << ";
pq1.поп ();
cout<<'\n';
докато(!pqA.празен ())

Cout << pqA.top() << ";
pqA.поп ();
cout<<'\n';

Резултатът е:

5 4 3 2 1
50 40 30 20 10

The emplace () Fuction
The emplace () функция е подобна на функцията за натискане. Следният код илюстрира това:

приоритетна_черта pq1;
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);
докато(!pq1.празен ())

Cout << pq1.top() << ";
pq1.поп ();
cout<<'\n';

Резултатът е:

50 40 30 20 10

Низови данни

Когато се сравняват низовете, трябва да се използва класът на низовете, а не директното използване на низовите литерали, защото той ще сравнява указателите, а не действителните низове. Следният код показва как се използва низовият клас:

#include
приоритетна_черта pq1;
низ s1 = низ ("писалка"), s2 = низ ("молив"), s3 = низ ("тетрадка"), s4 = низ ("текстова книга"), s5 = низ ("владетел");
pq1.натискане (s1); pq1.натискане (s2); pq1.натискане (s3); pq1.натискане (s4); pq1.натискане (s5);
докато(!pq1.празен ())

Cout << pq1.top() << " ";
pq1.поп ();
cout<<'\n';

Резултатът е:

учебник владетел молив химикалка тетрадка

Други конструкции с приоритетна опашка

Изрично създаване от вектор
Приоритетна опашка може да бъде създадена изрично от вектор, както показва следният код:

#include
вектор vtr = 10, 30, 20, 50, 40;
приоритетна_черта pq (vtr.begin (), vtr.край());
докато(!pq.празен ())

Cout << pq.top() << ";
pq.поп ();
cout<<'\n';

Резултатът е: 50 40 30 20 10. Този път трябва да бъде включен и заглавният вектор. Аргументите за функцията конструктор вземат началните и крайните указатели на вектора. Типът данни за вектора и типът данни за приоритетната_черта трябва да бъдат еднакви.

За да направи приоритет най-малкото значение, декларацията за конструктора ще бъде:

приоритетна_черта, по-голям> int>> pq (vtr.begin (), vtr.край());

Изрично създаване от масив
Опашка с приоритет може да бъде създадена изрично от масив, както показва следният код:

int arr [] = 10, 30, 20, 50, 40;
приоритетна_черта pq (arr, arr + 5);
докато(!pq.празен ())

Cout << pq.top() << ";
pq.поп ();
cout<<'\n';

Резултатът е: 50 40 30 20 10. Аргументите за функцията конструктор вземат началните и крайните указатели на масива. arr връща началния указател, “arr + 5” връща показалеца точно покрай масива, а 5 е размерът на масива. Типът данни за масива и типът данни за приоритетната_черта трябва да бъдат еднакви.

За да направи приоритет най-малкото значение, декларацията за конструктора ще бъде:

приоритетна_черта, по-голяма > 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 ++ priority_queue е опашка първо в първото излизане. Функцията член, натиснете (), добавя нова стойност към опашката. Функцията член, Горна част(), чете най-горната стойност в опашката. Функцията член, поп (), премахва, без да връща най-високата стойност на опашката. Функцията член, празен (), проверява дали опашката е празна. Въпреки това, приоритетната_черта се различава от опашката, по това, че следва някакъв приоритетен алгоритъм. То може да бъде най-голямо, от първо до последно или най-малкото, от първо до последно. Критериите (алгоритъмът) също могат да бъдат дефинирани от програмист.

Как да инсталирате и играете Doom на Linux
Въведение в Doom Серията Doom възниква през 90-те години след пускането на оригиналния Doom. Това беше незабавен хит и от този момент нататък серията ...
Vulkan за потребители на Linux
С всяко ново поколение графични карти виждаме, че разработчиците на игри преместват границите на графичната вярност и се приближават една крачка до фо...
OpenTTD срещу Simutrans
Създаването на собствена транспортна симулация може да бъде забавно, релаксиращо и изключително примамливо. Ето защо трябва да сте сигурни, че изпробв...