Софтуерно Инженерство
Loading...
+ Нов въпрос
Jovanna avatar Jovanna 97 Точки

задача 4.Emails  от подготовката за изпита - авторско решение на Г.Георгиев

Здравейте,

не ми е ясна декларацията на priority_queue-то в авторското решение на Г.Георгиев на з.4.Emails  от подготовката за изпита:

priority_queue<MessageRelevance, vector<MessageRelevance>, greater<MessageRelevance> > topMessagesByMinRelevance;

останалата част от кода е ясна.

Защо примерно не е:   priority_queue<MessageRelevance> topMessagesByMinRelevance;    ?

Какво правят в диамантените скоби и , vector<MessageRelevance>, greater<MessageRelevance>   ?

greater<MessageRelevance> e предполагам заради подредбата, да е decreasing order и вероятно прави връзка с дефинирания оperator< в класа.

 Моля за хелп.

 

Тагове:
0
C++ Fundamentals 13/01/2018 20:52:30
sun_seeker avatar sun_seeker 14 Точки

На края на последната лекция го обяснява, подрежда по големина елементите във вектора. По принцип във вектора 1-вия е най-малкия. А с greater<MessageRelevance> -  първия е най-големия по стойност примерно. Поне аз така го разбрах. Предполагам и Жоро ще се включи да обясни. 

1
georgi.stef.georgiev avatar georgi.stef.georgiev 640 Точки

Здравей,

Правилно предполагаш за greater параметъра. Както е казал и колегата, по този начин казваме, че последни искаме да са най-големите елементи (вместо най-малките, както е по default). А това го правим, защото искаме всеки път като стигнем определен брой елементи, да махнем най-ниско приоритетния (и затова държим най-ниско приоритетния на първо място, защото priority queue там ни дава достъп да махаме елементи).

Относно защо подаваме vector преди това - за всички container adapters (stack, queue, priority_queue) в стандартната библиотека можем да кажем вътрешно какво да ползват за паметта си. За целта подаваме структура, която искаме да ползва примерно нашия стек или опашка.

Сега, това рядко е нужно, но в синтаксиса на параметрите на приоритетната опашка е такъв, че на първо място идва типа, на второ идва този параметър за паметта, и чак на трето място идва параметърът за подредбата на елементите. Съответно ако искаме да променим подредбата на опашката (както в тази задача), трябва да подадем и втория параметър - няма как да подадем третия без да подадем втория. По default приоритетната опашка използва вектор (http://en.cppreference.com/w/cpp/container/priority_queue виж как в описанието на параметрите има class Container = vector), и ние искаме да запазим default-а, затова подаваме пак такова - защото единственото, което искаме да променим е подредбата.

Поздрави,

Жоро

1
MartinPaunov avatar MartinPaunov 75 Точки

Здравей,

priority_queue, е вид контейнер адаптор, който работи като използва за основата си друг контейнер, за което изисква подадения контейнер да поддържа random access iterators и да поддържа определени операции, като .size(), .empty() и др., по принцип, ако не е подаден конкретен контейнер, опашката използва vector. В този пример е декларирана с vector, зареди подредбата на елементите. Когато искаме да имаме някаква конкретна подредба различна от стандарната, трябва да му кажем, както контейнера, към който се адаптира, така и по какво да ги сравнява. В тази задача ги сравняваме по приоритет, което е видно от предефинирания оператор >. Когато кажем на някой контейнер да сортира елементите си по подреба на greater или less, контейнера трябва да знае по какво преценява елементите дали са по-малки или по-големи един от друг. Ако имаме int елементи, контейнера лесно знае, че може да ги сравни по сотйност. В този случай имаме обекти от class MessageRelevence, като контейнера не знае по какво се сортират такива обекти, за това и е предефиниран оператора, като контейнера сам търси дефениция на този оператор за да може да извърши подредбата на елементите, пробвай да закоментираш оператора и виж какво ще стане. Ще ти каже че не знае от сортиране на обекти от този клас. Ако исакш да направиш обратното сортиране тогава трябва да предефинираш и другия оператор. Когато ги сортираме по greater първият елемент е с най-малка стойност, а с less е обратното което е и по подразбиране например : 

std::priority_queue<int> q; - сортирани от по-високастойност към по-ниска стойност,
std::priority_queue<int, std::vector<int>, std::greater<int> > q2; - сортира по обратния ред от най-ниска към най-голяма стойност.

Дано съм отговорил на въпроса ти в нета пише доста за тези опашки има и много лесни за разбиране примери може да потърсиш още информация, защото това не е доста изчерпателен отговор.

Поздрави.

1
13/01/2018 21:52:10
Jovanna avatar Jovanna 97 Точки

Много ви благодаря! !!! 

0
13/01/2018 23:56:21