В библиотеке шаблонов имеется ряд стандартных функциональных объектов, предназначенных для передачи алгоритмам в качестве параметра, задающего конкретную операцию. Вот они:
Функциональный объект |
Операция |
Арифметические |
|
plus |
сложение х + у |
minus |
.вычитание х - у |
multiplies |
умножение х * у |
divides |
деление х / у |
modulus |
остаток х % у |
negate |
смена .знака -х |
Отношения |
|
equal to |
равенство == |
not equal to |
неравенство != |
greater |
больше > |
less |
меньше < |
greater equal |
больше или равно >= |
less equal |
меньше или равно <= |
Логические |
|
logical and |
логическое И && |
logical or |
логическое ИЛИ | | |
logical not |
логическое отрицание ! |
Например, вызов алгоритма
transform(vec.begin(), vec.endf), vec.begin(),
negate<int> ());
меняет знак всех элементов вектора vec.
Можно привести примеры более сложных функциональных объектов с “памятью”, которые хранят между вызовами информацию о своем текущем состоянии. Определяемые пользователем функциональные объекты часто производятся от шаблонов классов unary_function и binary_function.
Типичным примером функциональнь1х объектов, сохраняющих свое состояние, являются различные генераторы, как, например, генератор случайных чисел.
Вот программа, в которой реализуется совсем простой функциональный объект — генератор чисел Фибоначчи:
///////////////////////////////////////////////////
// FuncObj.cpp: Генератор чисел Фибоначчи.
//
#include <iostream>
#include <algorithm>
#include <vector>
#pragma hdrstop #include <condefs.h>
using namespace std;
class Fibo { // Класс функционального объекта.
int iCur, iNext;
public:
Fibo() { iNext = iCur =1; } // Инициализация состояния.
int operator ()() { // Операция вызова; возвращает
int temp = iCur; // следующий член ряда.
iCur = iNext; iNext = iCur + temp;
return temp;
} };
int main () {
//
// Сначала проверим вручную, как работает класс.
// Fibo fObj ;