Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
39
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 13. Итераторы и функциональные объекты

335

template <class Argl. class Arg2. class Result> struct binary_function{

typedef Argl first_argument_type; typedef Arg2 second_argument_type; typedef Result result_type; }: Функциональные объекты библиотеки являются потомками этих базовых объектов-функций. Определение стандартных имен типов для аргументов и результата необходимо для того, чтобы функциональные объекты можно было использовать совместно с адаптерами и другими средствами библиотеки.

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

Стандартная библиотека содержит описание нескольких типов адаптеров:

  • связыватели для использования функционального объекта с двумя аргументами как объекта с одним аргументом;

  • отрицатели для инверсии значения предиката;

  • адаптеры указателей на функцию]

  • адаптеры методов для использования методов в алгоритмах.

Синтаксис и применение перечисленных адаптеров рассматриваются в следующих разделах.

Арифметические функциональные объекты

В стандартной библиотеке определены шаблоны функциональных объектов для всех арифметических операций, определенных в языке C++.

Таблица 13.2. Арифметические функциональные объекты

Имя

Тип

Результат

plus

бинарный

х + у

minus

бинарный

х - у

multiplies

бинарный

х * у

divides

бинарный

х / у

I modulus

бинарный

X % У

negate

унарный

- X

Ниже приведен шаблон объекта pi us (остальные объекты описаны аналогичным образом):

template <class T> struct plus : binary_function<T. T. T>{ Т operatorO(const T& х. const T& у) const{

return x + у; }

336

Часть III. Стандартная библиотека

Поскольку функциональные объекты используются большей частью вместе с алгоритмами стандартной библиотеки, примеры применения арифметических функциональных объектов приведены в разделе «Алгоритмы» на с. 356, 370.

Предикаты

В стандартной библиотеке определены шаблоны функциональных объектов для операций сравнения и логических операций, определенных в языке C++. Они возвращают значение типа bool, то есть являются предикатами.

Таблица 13.3. Предикаты стандартной библиотеки

Имя

Тип

Результат

equal_to

бинарный

х — у

not_equal_to

бинарный

х != у

greater

бинарный

х > у

less

бинарный

х < у

greater_equal

бинарный

х >= у

less_equal

бинарный

х <= У

logical_and

бинарный

х && у

logical_or

бинарный

* II У

logicaljwt

унарный

! х

Ниже приведен шаблон объекта equa"l_to (остальные объекты описаны аналогичным образом):

template <class T> struct equal_to : binary_function<T. T, bool>{

bool operatorO(const T& x, const T& y) const{

return x == y; } }: Программист может описать собственные предикаты для определения критериев сравнения объектов. Это необходимо, когда контейнер состоит из элементов пользовательского типа. Например, для описанного на с. 183 класса monstr предикат, сравнивающий два объекта но значению поля ammo, имеет вид:

struct monstr_less__ammo:

public binary_function<monstr, monstr. bool>{ bool operator О(monstr & ml, monstr & m2){

return ml.get_ammo() < m2.get_ammo(); }

};

Примеры применения предикатов приведены на с. 338, 360, 363.