Контейнеры библиотеки STL. Последовательности типа vector.
Как вы видите, он имеет вид структуры (возможен и класс), в которой определена единственная операция operator (). В нем мы анализируем текущее значение флага сортировки и в зависимости от него возвращаем результат сравнения двух объектов, поступивших в качестве параметров, по тому или иному полю. Использование функционального объекта иллюстрируется следующим кодом, который вы можете вставить в конец существующей функции main:
//========= Используем функциональный объект Man::m_Sort = NAME; //========= Сортируем по имени sort (men.begin (), men.end(), ManLess ()); pr(men,"After function object name sort"); Man::m_Sort = AGE; //========= Сортируем по возрасту sort (men .begin (), men.end(), ManLess ()); pr(men,"After function object age sort");
Аналогично предикату greater<Type>, который мы уже использовали, в STL определен предикат less<Type>, который обеспечивает упорядочивание контейнера, задаваемое операцией operator< (). Но, если вы вставите в функцию main такой код:
//========= Используем стандартный предикат sort(men.begin(), men.end(),less<Man>()); pr(men,"After less<Man> sort");
То получите сообщение об ошибке, так как он будет искать реализацию operator< () в виде внешней функции с двумя сравниваемыми параметрами. Напомню, что мы уже реализовали эту операцию, но в виде метода класса с одним параметром. Для решения проблемы вы можете, не убирая старой версии, вставить новую. Декларируйте в классе Man внешнюю friend-функцию:
//========= Нужна для предиката less<Man>() friend bool operator< (const Man& a, const Man& b);
Затем дайте внешнее тело этой функции. Отношение порядка здесь намеренно изменено по сравнению с предыдущей реализацией operators (). Как оказалось, обе версии будут работать в различных ситуациях. Первая – при сортировке по умолчанию, а вторая – при сортировке предикатом less<Man>.
bool operator< (const Man& a, const Man& b) { //======== Сравниваем по возрасту return a.m_Age < b.m_Age; }
Проверьте результат, запустив приложение. Проследите, чтобы в main был при этом код с вызовом алгоритма сортировки с тремя Параметрами:
sort(men.begin (), men.end(),less<Man>());
Здесь же уместно добавить, что в STL есть шаблоны, которые называются negators (отрицатели). Шаблон not2, например, позволяет инвертировать результат бинарной операции. Вставьте в конец функции main следующий фрагмент:
//========= Используем отрицатель бинарной операции sort(men.begin (), men.endf), not2 (less<Man>())); pr(men,"After not2(less<Man>) sort");
И убедитесь в том, что последовательность отсортирована теперь по убыванию возраста.