На этом шаге мы рассмотрим использование бинарных предикатов.
Бинарные предикаты обычно сравнивают некоторое свойство двух аргументов. Например, чтобы отсортировать элементы по нестандартному критерию, программист передает алгоритму простую предикатную функцию. Это может понадобиться, если, например, элементы не могут корректно работать с оператором < или сортировка должна выполняться по нестандартному критерию.
В следующем примере множество с информацией о группе людей сортируется по именам и фамилиям:
#include <iostream> #include <string> #include <deque> #include <algorithm> using namespace std; class Person { public: string firstname() const; string lastname() const; . . . . }; // Бинарный предикат: // - сравнивает два объекта Person bool personSortCriterion (const Person& p1, const Person& p2) { // Первый объект Person меньше второго. // - если фамилия в первом объекте меньше фамилии во втором объекте: // - или если фамилии равны, а имя в первом объекте меньше. return p1.lastname()<p2.1astname() || (!(р2.lastname()<pl.lastname()) && p1.firstname()<p2.firstname()); } int main() { deque<Person> coll; sort(coll.begin(), coll.end(), // Интервал personSortCriterion); // Критерий сортировки . . . . }
Критерий сортировки также может определяться в виде объекта функции. У подобной реализации есть свои преимущества - критерий становится типом, который может использоваться, например, при объявлении множества, сортирующего свои элементы по этому критерию.
На следующем шаге мы рассмотрим объекты функций.