Професионална програма
Loading...
pesosz avatar pesosz 4 Точки

Exercises on Advanced Class Members and Code Organization - Task 3 - Vectors

Първият ми въпрос по задачата е: Защо при така написан код в Main-a: 

std::multiset<Vector, ReverseComparer<Vector, VectorLengthComparer> > vectors;

OverLoad-ваме оператор () , при положение, че VectorLengthComparer се извиква само с името си.

Търсих обяснения в нета за тия сетове и си загубих доста време, но не открих нищо полезно.. единствено, че са наредени контейнери.
template <class Key, class Compare = std::less<Key>> ..... така ми дава, че се инициализира set.
multiset <int, greater <int> > gquiz1;   <br> <br> Може ли обяснение, по написването на кода, защо веднъж пишеме Vector,ReverseComparer и в скобите му подаваме: Vector, VectorLengthComparer? 


Създаваме 

template<typename Container, typename Comparer>
struct ReverseComparer
{
    Comparer comparer;
    bool operator()(const Container & a, const Container & b)
    {
        return comparer.isSmaller(a,b);
    }
};

За Reverse сравненията... Но защо създаваме вътре обект от тип Comparer? И как този обект има достъп, до горната структура? Нали ппц за да имаме достъп до фукнции на даден клас, трябва да създадем елемент от този клас... а тук създаваме елемент от тип template... Как този template има достъп до функцията на struct VectorLengthComparer.


Последен въпрос: std::multiset<Vector, ReverseComparer<Vector, VectorLengthComparer> > vectors;  

Ако след Vector, VectorLengthComparer добавя < неща за сравнение > това ще сравни multiset-a, по още критерии?

Тагове:
0
C++ Advanced
j.petrov_90 avatar j.petrov_90 372 Точки

Привет,

“std::multiset<Vector, ReverseComparer<Vector, VectorLengthComparer> > vectors;
OverLoad-ваме оператор () , при положение, че VectorLengthComparer се извиква само с името си.“

Защото това е така нареченият C++ Functor (или обект, който като го подадем някъде ще сме сигурни, че автоматично ще му се извика оператора кръгли скоби).

"Последен въпрос: std::multiset<Vector, ReverseComparer<Vector, VectorLengthComparer> > vectors;  
Ако след Vector, VectorLengthComparer добавя < неща за сравнение > това ще сравни multiset-a, по още критерии?"

Странно тълкование, но да кажем, че - да, това ще добави "допълнителни критерии". Само където ние с код трябва да напишем как точно да работят тези критерии.
Преди няколко дена тук: https://softuni.bg/forum/25856/templates-cplusplus-code-organisation-task-5-sorting
 ти бях дал списък с 4 неща, които могат да накарат 1 std::set<> да работи за по-сложни типове данни. Прочети ги пак.

"За Reverse сравненията... Но защо създаваме вътре обект от тип Comparer? И как този обект има достъп, до горната структура? Нали ппц за да имаме достъп до фукнции на даден клас, трябва да създадем елемент от този клас... а тук създаваме елемент от тип template... Как този template има достъп до функцията на struct VectorLengthComparer."

Това ми е малко трудно да го разбера, извинявай.
Защо създаваме вътре обект от тип Comparer? - За да можем да го използваме.
И как този обект има достъп, до горната структура? - всички полета в един клас имат достъп помежду си чрез функции на класа.

Поздрави

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