Loading...

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

Jovanna avatar Jovanna 186 Точки

задача 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 15 Точки

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

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

Здравей,

Правилно предполагаш за 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 77 Точки

Здравей,

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 186 Точки

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

0
13/01/2018 23:56:21
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.