Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: У кого больше функциональных адаптеров, друг за другом...
Форум на CrossPlatform.RU > Курилка > Алгоритмы, задачи по программированию, логические игры
ViGOur
Что, может попробуем посоревноваться кто больше осмысленных функциональных адаптеров друг за другом выстроит?
Например так:
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)) - функциональные адаптеры, с помощью которых мы находим первый четный элемент списка...
Алексей1153
мы тут, понимаешь, к простоте и читаемости кода стремимся ;)
ViGOur
Я сейчас начал углубленное изучение STL, и окончательно убедился, что этот код все же читабелен! :)
Вот что не очень читабельно на первых порах, так это:
"compose.hpp"
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);
}
"Пример использования (main.cpp)"
#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;
}
Кстати, compose.hpp из буста... :)
Iron Bug
Цитата(ViGOur @ 31.3.2011, 0:29) *
Вот что не очень читабельно на первых порах, так это

а что тут нечитабельного? обычные темплейты... может, это с непривычки они кажутся сложными. но там нет ничего хитрого. главное, в синтаксисе не наделать опечаток. а то компилятор на ошибки в темплейтах выдаёт совершенно невменяемые сообщения и потом фиг найдёшь, что ему на самом деле не нравится.
ViGOur
И с непривычки и по первости они именно такими и кажутся! :)
Хотя попользовавшись чуть-чуть начинаешь понимаешь их удобство.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.