Операции сравнения
Стандартная библиотека поддерживает следующие функторы для операций сравнения:
// Истина, если первый операнд равен второму
// для типа Tтребует перегруженного оператораoperator==
template<class T>
struct equal_to : binary_function<T, T, bool>
{
bool operator()(const T& x, const T& y) const;
};
// Истина, если первый операнд не равен второму
// для типа Tтребует перегруженного оператораoperator!=
template<class T>
struct not_equal_to : binary_function<T, T, bool>
{
bool operator()(const T& x, const T& y) const;
};
// Истина, если первый операнд меньше второго
// для типа Tтребует перегруженного оператораoperator<
template<class T>
struct less : binary_function<T, T, bool>
{
bool operator()(const T& x, const T& y) const;
};
// Истина, если первый операнд больше второго
// для типа Tтребует перегруженного оператораoperator>
template<class T>
struct greater : binary_function<T, T, bool>
{
bool operator()(const T& x, const T& y) const;
};
// Истина, если первый операнд меньше либо равен второму
// для типа Tтребует перегруженного оператораoperator<=
template<class T>
struct less_equal : binary_function<T, T, bool>
{
bool operator()(const T& x, const T& y) const;
};
// Истина, если первый операнд больше либо равен второму
// для типа Tтребует перегруженного оператораoperator>=
template<class T>
struct greater_equal : binary_function<T, T, bool>
{
bool operator()(const T& x, const T& y) const;
};
Функторы для операций сравнения очень похожи на функторы арифметических выражений, за исключением того, что возвращаемое значение имеет тип bool, и равноtrueв случае если соответствующее условие выполняется иfalseв противном случае.
Следующий пример показывает как функтор для операции сравнения может быть использован для сортировки содержимого вектора не по возрастанию, а по убыванию. В случае сортировки по убыванию, алгоритму sortв качестве предиката передается функтор для операцииgreater, который возвращаетtrueв случае если первый аргумент большое чем второй, а не наоборот, как это предполагает алгоритмsort.
#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>
#include <cstdlib>
using namespace std;
int my_rand()
{
return rand() % 50;
}
void print (int arg)
{
cout << arg << ',';
};
int main (int, char**)
{
vector<int> v(20);
generate(v.begin(),v.end(),my_rand);
for_each(v.begin(),v.end(),print);
cout << endl;
sort(v.begin(),v.end());
for_each(v.begin(),v.end(),print);
cout << endl;
sort(v.begin(),v.end(),greater<int>());
for_each(v.begin(),v.end(),print);
cout << endl;
return 0;
}
Логические операции
Стандартная библиотека также содержит функторы для следующих логических операций:
// Возвращает результат применения логической конъюнкции к своим операндам
// для типа Tтребует перегруженного оператораoperator&&
// смысл операции конъюнкции для типа Tопределяется реализациейoperator&&
template<classT>
struct logical_and : binary_function<T, T, bool>
{
bool operator()(const T& x, const T& y) const;
};
// Возвращает результат применения логической дизъюнкции к своим операндам
// для типа Tтребует перегруженного оператораoperator||
// смысл операции дизъюнкции для типа Tопределяется реализациейoperator||
template<class T>
struct logical_or : binary_function<T, T, bool>
{
bool operator()(const T& x, const T& y) const;
};
// Возвращает результат применения логического отрицания к своему операнду
// для типа Tтребует перегруженного оператораoperator!
// смысл операции логического отрицания для типа Tопределяется
// реализацией operator!
template<class T>
struct logical_not : unary_function<T, bool>
{
bool operator()(const T& x) const;
};
Функторы логических операций возможно не так полезны как функтора арифметических операций и операций сравнения, сложно привести практический пример их применения, однако они приведены в этом описании, чтобы дополнить список поддерживаемой стандартной библиотекой функторов. Кроме того, функторы логических операций могут быть полезны при объединении с другими функтора посредством связывателей, которые рассматриваются далее.