470_____________________Часты!!!. Современное программирование на C++
I / Функция-шаблон для использования в качестве объекта-функции
template <class T>
class WRITE_OBJECT
{
public:
void operator()(Т &t)
( cout « t « " "; } };
int main() (
vector<string> strVector;
strVector.push_back("All");
strVector.push back("good"); ^
strVector.push_back("things");
strVector.push_back("must") ;
strVector.push_back("come");
strVector.push_back("to") ;
strVector.push_back("an"); •
strVector.push_back("end.");
cout « "Вывод с помощью функтора (WriteStr): ";
for_each(strVector.begin(), strVector.end(), WriteStr) ;
cout « endl;
cout « "Вывод с помощью объекта-функции (WRITE_STR): ";
for_each(strVector.begin(), strVector.end(), WRITE_STR(');
cout « endl;
cout « "Вывод с помощью объекта-функции (WRITE_OBJECT): ";
for_each(strVector.begin(), strVector.end(), WRITE_OBJECT<string>() ) ;
cout « endl;
return 0;
Код функтора проще, чем код класса для объекта-функции. Зачем же нужны объекты-функции? Если функциональность предназначена только для одного класса, вполне достаточно функции WriteStr. Но если такая функциональность должна работать более чем для одного типа объектов, удобным будет использование класса WRITE OBJECT.
Алгоритм for_each использует функцию одного аргумента. Такая функция называется унарной. Функция, имеющая два аргумента, называется бинарной. Алгоритм STL transform применяет пользовательскую функцию юодной или двум входным последовательностям. Разница между for_each и transform заключается в том, что для вывода результатов в функцию transform передается итератор вывода. Если требуется две входные последовательности, необходима бинарная функция. Листинг 18.20 демонстрирует определение и использование бинарной функции с алгоритмом transform.