Loading...
Jovanna avatar Jovanna 186 Точки

C++ Advanced Task 05_05 - Sorting - custom comparator

Здравейте,

моля за хелп за std::set<std::string, Reverse<std::string, LessThan<std::string> > >

Как да му разпиша компаратора, изобщо нямам идея как да подходя, записът с диамантените скоби ми е непонятен за момента в тази ситуация. В нета има разни варианти за custom comparator, но това, което би ми помогнало за тук, не намерих. 

Колеги коментираха задачата, разбирам, че Reverse вика LessThan,  но, като функции ли да ги разпиша , по 2 параметъра ли приемат? 

... нещо от сорта на (?което сигурно не е вярно?):

bool LessThan(std::string& s1, std::string& s2) {
    return (s1 < s2);
}

bool Reverse(std::string& s1, std::string& s2) {
    if (LessThan(s1, s2)) {
        return false;
    }
    return true;
}

//и каква е логиката ако едното връща true, другото да върне false за същото нещо, не виждам смисъла?

Поздрави!

Тагове:
0
C++ Programming 09/10/2018 14:41:30
Todir avatar Todir 24 Точки
Best Answer

Да нещо такова, но тряба да са функтори а не функции и да са темплейти. Качили са видеото от снощи та най-добре изгледай решението на 3-та задача. Жоро го обясни в детайли. Някъде след средата трябва да е. Всъщност направо има и решението :)

1
Jovanna avatar Jovanna 186 Точки

Гледах видеото и мисля че го понаписах в тази част, но ми дава грешка " Redefinition of class LessThan<T>", защо?

#ifndef COMPARATORS_H
#define COMPARATPRS_H

template <typename T>
class LessThan {
public:
    bool operator() (const T& a, const T& b) {
        return a < b;
    }
};

template <typename T, typename Comparator>
class Reverse {
private:
    Comparator comp;

    public:
    bool operator() (const T& a, const T& b)
    {
        bool aLessThanB = this->comp(a, b);
        return !aLessThanB;
    }
};


Също,  извеждането, не разбирам къде бъркам:

template <typename T>
void printContainer(std::set<T, Reverse<T, LessThan<T> > >::iterator itBegin,
    std::set<T, Reverse<T, LessThan<T> > >::iterator itEnd) {
    for (std::set<T, Reverse<T, LessThan<T> > >::iterator it = itBegin; it != itEnd; it++) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}

template <>
void printContainer(std::set<Song, Reverse<Song, LessThan<Song> > >::iterator itBegin,
    std::set<Song, Reverse<Song, LessThan<Song> > >::iterator itEnd) {
    for (std::set<Song, Reverse<Song, LessThan<Song> > >::iterator it = itBegin; it != itEnd; it++) {
        std::cout << it->getName << " " << it->getLengthSeconds << " ";
    }
    std::cout << std::endl;
}

ето кода: https://pastebin.com/aunUBXkP

 

0
09/10/2018 21:00:40
Todir avatar Todir 24 Точки

Функцията принт е същата като от 3-та задача. Мисля, че я има и в демотата на предишната лекция за темплейтите а и Жоро ни я показа на лекцията. Темплейта не трябва да е за типа данни в сета а за самия сет. Функцията трябва да може да изпечата всякакъв клас който има итератор и оператор << без значение какво е сет, вектор, обект и всичко друго. Трябва ни итератора на сета и е без ниакакво значение какво има в самия сет.

Когато се извика като в мейна например printContainer<Set>(numbers.begin(), numbers.end()); това казва. че Т е set и навсякъде където си сложила Т то се заменя със set и реално функцията така както си я написала става все едно търси итератор на сет от сетове.

void printContainer(typename T::iterator begin, typename T::iterator end)

typename T::iterator it = begin;

1
09/10/2018 21:02:02
Jovanna avatar Jovanna 186 Точки

май оправих принт-а, благодаря! Но, така или иначе програмата не тръгва, дава грешка " Redefinition of class LessThan<T>" и грешка " Redefinition of class Reverse<T, Comparator>", това защо?

#ifndef COMPARATORS_H
#define COMPARATPRS_H

template <typename T>
class LessThan {                                    //грешка " Redefinition of class LessThan<T>"
public:
    bool operator() (const T& a, const T& b) {
        return a < b;
    }
};

template <typename T, typename Comparator>
class Reverse {                                                   //грешка " Redefinition of class Reverse<T, Comparator>"
private:
    Comparator comp;

    public:
    bool operator() (const T& a, const T& b)
    {
        bool aLessThanB = this->comp(a, b);
        return !aLessThanB;
    }
};

 

//принт:

template<typename Container>
void printContainer(typename Container::iterator iBegin, typename Container::iterator iEnd) {
    //template<typename Container>
    //void print(Container container) {
        typename Container::iterator i;
        for (i = iBegin; i != iEnd; i++) {
            std::cout << *i << " ";
        }
        std::cout << std::endl;
    //}
}

0
09/10/2018 21:40:23
Todir avatar Todir 24 Точки

При мен се компилира правилно с твоя код. Изтегли си наново скелета и пробвай пак.

1
Jovanna avatar Jovanna 186 Точки

Всичко наново, и във VS и в Code::Blocks, същите грешки дава: 

//грешка " Redefinition of class LessThan<T>"   и  //грешка " Redefinition of class Reverse<T, Comparator>"

ето кода: https://pastebin.com/2ncviHFq

да не е от сейфгардовете нещо?

0
Jovanna avatar Jovanna 186 Точки

Пробвах директно и в Judge - компилационна. 

0
Todir avatar Todir 24 Точки

Мда

#ifndef COMPARATORS_H

#define COMPARATPRS_H

:)

И нямаш нужда да инклудваш Parser.h и Comparators.h в printutils.

0
Jovanna avatar Jovanna 186 Точки

Велик!!  Красота...  :-))  

 

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