Здравствуйте peter@work, Вы писали:
ПК>>ПК>>struct CStudentNameIsLess
peter>вот тут поясни, plz.
В std::list есть две перегруженных функции sort. Одна имеет сигнатуру `
void sort()' и при сортировке использует операцию `<' для определения порядка элементов. Если для твоего класса существует "естественный" порядок и определена операция `<', никаких танцев с бубном вообще не требуется: пиши себе slist.sort(), как и для встроенных типов.
Если же операция `<' не определена или требуется отсортировать элементы в порядке, отличном от того, который задается этой операцией, то можно воспользоваться второй функцией std::list<>::sort, которая задана шаблоном `
template<class Predicate> void sort(Predicate)'. Эта функция использует переданный ей объект для определения порядка элементов. К аргументу функции должна быть применима операция (). Т.е. либо класс переданного объекта должен иметь перегруженную операцию `()', либо объектом должен быть указатель на соответствующую функцию, принимающую два аргумента того же типа, что и элементы контейнера и возвращающую true, если и только если элементы находятся в "правильном" порядке (тот, что задан первым аргументом, находится "левее" второго).
Таким образом, для класса CStudent можно определить функцию:
bool student_name_is_less(const CStudent& l, const CStudent& r);
Или класс, переопределяющий операцию `()' с двумя аргументами:
struct CStudentNameIsLess
{
bool operator()(const CStudent& l, const CStudent& r) const;
};
Для вызова функции sort c аргументом в первом случае нужно писать что-нибудь вроде:
slist.sort(student_name_is_less);
Во втором случае нужно сконструировать временный объект класса CStudentNameIsLess и передать его в качестве аргумента:
slist.sort(CStudentNameIsLess());
Для некоторых компиляторов второй способ является более эффективным, т.к. позволяет легче избежать косвенного вызова функции через указатель. Кроме того, второй способ позволяет реализовать более сложную функцию сравнения, требующую дополнительных аргументов, кроме const CStudent& l и const CStudent& r. Эти аргументы можно сохранить в классе CStudentNameIsLess, передав их в конструкторе временного объекта.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен