Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
STL5 / lab8-functors / lab8-STL-functor.doc
Скачиваний:
9
Добавлен:
10.04.2015
Размер:
259.07 Кб
Скачать

Операции сравнения

Стандартная библиотека поддерживает следующие функторы для операций сравнения:

// Истина, если первый операнд равен второму

// для типа 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;

};

Функторы логических операций возможно не так полезны как функтора арифметических операций и операций сравнения, сложно привести практический пример их применения, однако они приведены в этом описании, чтобы дополнить список поддерживаемой стандартной библиотекой функторов. Кроме того, функторы логических операций могут быть полезны при объединении с другими функтора посредством связывателей, которые рассматриваются далее.

Соседние файлы в папке lab8-functors