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

5. Sort от Code Organization and Templates

Здравейте!

Имам нужда от помощ за задачката, тъй като не мога да захапя почти нищо от нея. Ще се опитам да структурирам въпроса си максимално точно и кратко, за да не губя времето ви:

1. printContainer<Set>(words.begin(), words.end()) -  това е едната функция, която се подава в структурата на програмата (в maina). На пръв поглед изглежда елементарно - принтира се set, а като аргументи се подават началото и края му чрез итератори. Обърква ме какво е това <Set>. Ясно ми е, че трябва да се използва template, за да може функцията да приеме итератори за set <Song, string или int> без проблем... Но щом синтаксисът за викане на фунцкията е funcName <Set> (), значи има нещо специфично -  само че в случая нямам нужда от специализация за темплейта, защото освен set, нищо друго не се принтира. С const template или как се прави това?

2. typedef std::set<Song, Reverse<Song, LessThan<Song>>> Set; - това първоначално като го видях, си казах оставям я тази задача, не е за мен :D Един колега я е решил и ми каза да прочета малко за C++ templates with functor... Разрових се в иинтернет, но да си призная от Basic C++ курса, до тук за пръв път срещам концепция, която не мога да разбера дори след 1 час дебъгване. Наистина не вдявам, защо трябва да overload-на оператора () (смисълът от functor), а после като се вика функцията не се използва (), a само <>... В общи линии направил съм един клас Reverse и забих - концепцията ми е ясна, имаме тип данни (int, string или custom), както и компаратор, но как да структурирам това, за да работи случая? Моля някой да ми даде някакви насоки - просто не мога да осмисля какво трябва да направя. 

Благодаря предварително на всеки, който отдели време за казуса ми!

 

Тагове:
0
C++ Advanced
WasteOfRAM avatar WasteOfRAM 5 Точки

<Set> е тип който ние си създаваме. "typedef std::set<int, Reverse<int, LessThan<int> > > Set;". На практика е STL set но приема custom comperator. STL set може да приеме комператор така "std::set<int, comp>". Нешия Set приема комператор "Reverse<int, LessThan<int>" който приема комператор "LessThan<int>". Незнам колко добре го обясних надявам се да е от помощ.

1
j.petrov_90 avatar j.petrov_90 162 Точки

Привет,

Колегата, WasteOfRAM е дал добър отговор.

Концепцията за "C++ Functor", за който си прочел е точно това, което пише.
Обект, който се създаде, му се извиква оператора кръгли скоби. Т.е. можем да подаваме този обект като способ за някакво действие (в случая сравнение).

Подходът ми да ви карам да четете допълнително за последните задачи от домашното е точно такъв - а именно човек да придобие способността да мисли и намира допълнително информация.
Няма ден в професионалния ми опит, в който не ми се налага да се сблъсквам с непозната материя. Повярвай ми и при теб ще е така.

Да се върнем на структурата от данни std::set<> например.

Не можем да кажем std::set<Song>, защото трябва да сме дали на set::set-а способ за сравнение на 2 обекта от тип "Song".

Този способ може да е (говоря за кой и да е тип - не конкретно за "Song"):
    > operator<(const T& left, const T& right) { //конкретна имплементация };
    > външна функция, която да подадеш на контейнера, която да сравнява 2 обекта от типа на контейнера;
    > lambda фунция (същото като горното, само че написана на място). Нещо като [](const T& left, const T& right) { //конкретна имплементация }
    > Functor (или C++ структура или class, който в себе си да има предефиниран оператора кръгли скоби "bool operator()(const T& left, const T& right){ //конкретна имплементация }")

Поздрави

1