Что, может попробуем посоревноваться кто больше осмысленных функциональных адаптеров друг за другом выстроит?
Например так:
std::list<int> listInt;
for( int n = 0; n < 100;++n)
listInt.push_back(n);
std::list<int>::iterator pos = std::find_if( listInt.begin(), listInt.end(),
std::not1( std::bind2nd( std::modulus<int>(), 2)));
...
где std::not1( std::bind2nd( std::modulus<int>(), 2)) - функциональные адаптеры, с помощью которых мы находим первый четный элемент списка...
мы тут, понимаешь, к простоте и читаемости кода стремимся
Я сейчас начал углубленное изучение STL, и окончательно убедился, что этот код все же читабелен!
Вот что не очень читабельно на первых порах, так это:
template <class OP1, class OP2>
class compose_f_gx_t
: public std::unary_function<typename OP2::argument_type,
typename OP1::result_type>
{
private:
OP1 op1; // process: op1(op2(x))
OP2 op2;
public:
// constructor
compose_f_gx_t(const OP1& o1, const OP2& o2)
: op1(o1), op2(o2) {
}
// function call
typename OP1::result_type
operator()(const typename OP2::argument_type& x) const {
return op1(op2(x));
}
};
// Вспомогательная функция для композиционного адаптера compose_f_gx
template <class OP1, class OP2>
inline compose_f_gx_t<OP1,OP2>
compose_f_gx (const OP1& o1, const OP2& o2) {
return compose_f_gx_t<OP1,OP2>(o1,o2);
}
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>
int main()
{
vector<int> coll;
for (int i=1; i<=9; ++i) {
coll.push_back(i);
}
PRINT_ELEMENTS(coll);
// К каждому элементу прибавляем 10 и умножаем на 5, и выводим на печать в std::cout с пробелом в качестве разделителя
transform (coll.begin(),coll.end(),
ostream_iterator<int>(cout," "),
compose_f_gx(bind2nd(multiplies<int>(),5),
bind2nd(plus<int>(),10)));
cout << endl;
}
И с непривычки и по первости они именно такими и кажутся!
Хотя попользовавшись чуть-чуть начинаешь понимаешь их удобство.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)