Функциональные объекты
Функциональный объект — это представитель класса, в котором определена операция вызова (скобки). Существуют различные ситуации, когда желательно передавать алгоритмам не функции, а функциональные объекты. Иногда это позволяет применить готовый функциональный объект стандартной библиотеки вместо новой функции; иногда — улучшить производительность благодаря генерированию встроенного кода. Кроме того, операция вызова может иметь доступ к информации, которая хранится в объекте — функциональный объект, в отличие от функции, обладает “памятью”.
В библиотеке шаблонов имеется ряд стандартных функциональных объектов, предназначенных для передачи алгоритмам в качестве параметра, задающего конкретную операцию. Вот они:
| Функциональный объект | Операция |
| Арифметические | |
| 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 ;
cout << "Generated sequence of 16 numbers:" << endl;
for (int i=0; i<15; i++) cout << fObj () << ", ";
cout << f0bj() “ endl;
//
// Теперь генерируем вектор с помощью
// стандартного алгоритма.
//
vector<int> iVec(16);
generate (iVec .begin (), iVec.end(), Fibo());
cout << endl<< "Vector initialized by generate () algorithm:"<< endl;
copy (iVec .begin (), iVec.end(),ostream_iterator<int> (cout, " "));
return 0;
}
Программа выводит:
Generated sequence of 16 numbers:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987
Vector initialized by generate() algorithm:
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
Хотя отладочный режим низкого уровня полностью интегрирован в среду C++Builder, к отладке также пришлось привыкать. Дизайнер форм. Инспектор объектов и другие средства остаются доступными во время работы программы, поэтому вносить изменения можно в процессе отладки.
BIOS видеоадаптеровАдресное пространство памяти ПК Препроцессор и особенности компилятора Отладка программ