STL функторы

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

#include <iostream>
#include <list>
#include <functional>
#include <algorithm>
using namespace std;


void main()
{		
	list<int> numbers;

	for(int i = 0; i < 10; i++)
		numbers.push_back(rand() % 100);

	list<int>::iterator ptr;

	for(ptr = numbers.begin(); ptr != numbers.end(); ptr++)	
		cout<<*ptr<<" ";		
	cout<<endl;	

	ptr = find_if(numbers.begin(), numbers.end(), bind2nd(greater_equal<int>(), 50) );

	if(ptr == numbers.end() )
		cout<<"not found"<<endl;
	else
		cout<<*ptr<<" found"<<endl;
}

У нас есть список numbers из десяти элементов, которые мы заполняем случайным образом в диапазоне от 0 до 100. Мы хотим найти элемент списка, который больше или равен 50. При первом нахождении элемента, который отвечает нашему условию, функция find_if возвращает итератор найденного элемента и прекращает свою работу. В качестве первого и второго параметра принимает итератор первого и последнего элемента списка, т.е. numbers.begin() и numbers.end(). В функции find_if в качестве указателя на функцию предусмотрен только один параметр. Но нам нужно как-то связать функтор greater_equal и значение 50. Для этого мы используем функцию bind2nd(), которая называется связкой.

Функтор greater_equal относится к функторам операторов сравнения. Все функторы операторов сравнения: equal_to, not_equal_to, less, greater, less_equal, greater_equal.

 

 

Комментарии и пинги к записи запрещены.

Комментарии закрыты.

Яндекс.Метрика