Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> boost::bind - для двух предикатов 
V
    Опции темы
boostcoder
Дата 18.12.2010, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Всем привет.
Вот любопытно, кто и как, переписал бы этот код с использованием boost::bind() вместо pred().
Код

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

bool _pred1(int v) {
   return v > 5;
}
bool _pred2(int v) {
   return v < 11;
}
bool pred(int v) {
   return _pred1(v) && _pred2(v);
}

int main() {
   std::vector<int> iv({3,4,5,67,7,6,45,3,23,4,5,67,8,8,6,4,3}), iv2;

   std::copy_if(iv.begin(), iv.end(), std::back_inserter(iv2), pred);
   std::copy(iv2.begin(), iv2.end(), std::ostream_iterator<int>(std::cout, ", "));
}

http://liveworkspace.org/code/76204a07cf59...f3302ba715bf863
т.е. интересует именно способ избавления от pred(). _pred1() и _pred2() допустим библиотечные функции.

Это сообщение отредактировал(а) boostcoder - 18.12.2010, 19:44
PM WWW   Вверх
boostcoder
Дата 18.12.2010, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



напрашивается что-то типа:
Код

boost::bind(
   boost::bind(_pred1, _1),
   boost::bind(_pred2, _1)
);

но это не правильно..
PM WWW   Вверх
mes
Дата 18.12.2010, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  18.12.2010,  18:48 Найти цитируемый пост)
но это не правильно.. 

logical_and забыто..

Добавлено через 1 минуту и 53 секунды
Код

   std::copy_if(iv.begin(), iv.end(), std::back_inserter(iv2)   
     , std::bind(std::logical_and<bool>()
       , std::bind(_pred1, std::placeholders::_1)
        , std::bind(_pred2, std::placeholders::_1 ) ) );


http://liveworkspace.org/code/d50c1e6bda8e...b306d3cb645eda0


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 18.12.2010, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  18.12.2010,  20:37 Найти цитируемый пост)
logical_and забыто..

ага. а я полез в boost.lambda искать способ smile 

спасибо огромное smile

Добавлено через 8 минут и 41 секунду
но вопрос еще не закрыт. интересует следующее.
можно ли как-то создать шаблон, который сможет в качестве параметров принимать функторы, и дополнительным параметром принимать logical_*. есть идеи?
что-то типа:
Код

std::copy_if(iv.begin(), iv.end(), std::back_inserter(iv2)   
   predicate<
      std::bind(_pred1, std::placeholders::_1),
      std::bind(_pred2, std::placeholders::_1),
      std::logical_and<bool>
   ::type()
);

PM WWW   Вверх
mes
Дата 18.12.2010, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  18.12.2010,  19:41 Найти цитируемый пост)
ага. а я полез в boost.lambda искать способ 

лямбда тоже поможет

Цитата(boostcoder @  18.12.2010,  19:41 Найти цитируемый пост)
спасибо огромное  

пож smile

Это сообщение отредактировал(а) mes - 18.12.2010, 20:51


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 18.12.2010, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(boostcoder @  18.12.2010,  20:41 Найти цитируемый пост)
можно ли как-то создать шаблон, который сможет в качестве параметров принимать функторы, и дополнительным параметром принимать logical_*. есть идеи?

ага. понял. сейчас..
PM WWW   Вверх
Earnest
Дата 20.12.2010, 15:10 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



boostcoder, я так понимаю, ты сейчас бустом увлечен по самые уши. Но имей в виду следующее. Когда в коде видишь трехэтажный байнд, хочется найти автора и кое-что ему оторвать ... (руки, если что).
In real life полезны только простые байнды, которые читаются на раз, без лишнего напряжения извилин, которые обычно заняты чем-нибудь еще. Поддерживать зашифрованный переизбытком буста код очень тяжело.
Я тоже сначала этим делом увлекалась, каждый цикл с итераторами норовила алгоритмом заменить, ну и в таком духе. Прошло, после возвратов к коду годичной давности. Забайндить можно многое, но далеко не все следует делать. 
Так что знай меру и будь проще. Это, конечно, не только к бусту относится.


--------------------
...
PM   Вверх
boostcoder
Дата 20.12.2010, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Earnest @  20.12.2010,  15:10 Найти цитируемый пост)
Но имей в виду следующее. Когда в коде видишь трехэтажный байнд, хочется найти автора и кое-что ему оторвать

согласен, если в коде увидеть такое:
Код

   std::copy_if(iv.begin(), iv.end(), std::back_inserter(iv2)   
     , std::bind(std::logical_and<bool>()
       , std::bind(_pred1, std::placeholders::_1)
        , std::bind(_pred2, std::placeholders::_1 ) ) );

но а если так?:
Код

   std::copy_if(iv.begin(), iv.end(), std::back_inserter(iv2),
      and_pred<...>()
);

разве не очевидней и понятней? smile 

Цитата(Earnest @  20.12.2010,  15:10 Найти цитируемый пост)
Я тоже сначала этим делом увлекалась, каждый цикл с итераторами норовила алгоритмом заменить

так и делаю. не люблю циклы в коде. что в этом плохого?
понятней ведь использование copy_if() и подобных, чем, к примеру, цикл с if`ами smile 
ну а for или while без if`ов, т.е. просто для копирования, вообще нелепо смотрится. разве нет?

Добавлено через 4 минуты и 16 секунд
Цитата(Earnest @  20.12.2010,  15:10 Найти цитируемый пост)
будь проще. Это, конечно, не только к бусту относится.

не понял.. это намек на что-то личное? smile 

Это сообщение отредактировал(а) boostcoder - 20.12.2010, 20:06
PM WWW   Вверх
borisbn
Дата 20.12.2010, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



boostcoder, в чём-то согласен с Earnest ( кроме
Цитата(Earnest @  20.12.2010,  15:10 Найти цитируемый пост)
Так что знай меру и будь проще. Это, конечно, не только к бусту относится.

. это, наверное, действительно что-то личное smile )
тебе часто приходилось поддерживать/изменять чужой код ?
если в нём всё натыкано предикатами, функторами и т.п., и если там всё работает так как надо, то выглядит это оч.хор., но если нужно что-то изменить - обычный цикл ( for или while ) - гораздо проще. в сопровождении, конечно, а не просто в чтении/понимании кода

Это сообщение отредактировал(а) borisbn - 20.12.2010, 20:55


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 20.12.2010, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(borisbn @  20.12.2010,  20:52 Найти цитируемый пост)
но если нужно что-то изменить - обычный цикл ( for или while ) - гораздо проще.

наоборот smile

Добавлено через 1 минуту и 23 секунды
Цитата(borisbn @  20.12.2010,  20:52 Найти цитируемый пост)
это, наверное, действительно что-то личное

я с Earnest не знаком. вроде даже нигде не пересекались smile 
PM WWW   Вверх
borisbn
Дата 20.12.2010, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



функтор ещё нужно найти в чужом коде (хотя... с томатоАссистентом - но проблем), и к тому же, возможно, при изменении этого функтора заденутся другие места программы, а тебе нужно поменять только в этом месте... Ладно. IMHO этот холивор такой же бессмысленный и беспощадный, как far vs Total или Ctrl+C vs Ctrl+Ins :



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 20.12.2010, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  20.12.2010,  19:05 Найти цитируемый пост)
но а если так?:

тогда уж если делать, то, имхо, чтоб было хотя бы так :
 std::copy_if(iv.begin(), iv.end(), std::back_inserter(iv2)  ,  my_bind  ( logical_and, _pred1, _pred2 ) );

считаем что лямбды нам запретили..


Это сообщение отредактировал(а) mes - 20.12.2010, 21:16


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 20.12.2010, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(borisbn @  20.12.2010,  21:05 Найти цитируемый пост)
IMHO этот холивор такой же бессмысленный и беспощадный, как far vs Total или Ctrl+C vs Ctrl+Ins

нет. я в этом вижу гибкость проектирования.
при использовании цикла, тебе нужно чтоб он имел в распоряжении все переменные/объекты которыми оперирует. это монолит. нужно следить за точками входа/выхода.
а при использовании предикатов, ты отвязываешься от локального кода в котором предикат используется. всю необходимую информацию о точках входа/выхода нет надобности держать в голове. получается своего рода изолированность от локального блока кода. всю информацию которая необходима предикату, ты передаешь ему в конструктор. smile

Добавлено @ 21:18
Цитата(mes @  20.12.2010,  21:12 Найти цитируемый пост)
my_bind  ( logical_and, _pred1, _pred2 )

слишком много деталей..
если у предиката имя типа "and_pred", и видно что он используется в std::copy_if(), то(по крайней мере мне) становится понятно его внутренее устройство.

Добавлено через 5 минут и 43 секунды
Цитата(mes @  20.12.2010,  21:12 Найти цитируемый пост)
считаем что лямбды нам запретили..

пока - да


Это сообщение отредактировал(а) boostcoder - 20.12.2010, 21:20
PM WWW   Вверх
mes
Дата 20.12.2010, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  20.12.2010,  20:15 Найти цитируемый пост)
слишком много деталей..

согласен.. 

Цитата(boostcoder @  20.12.2010,  20:15 Найти цитируемый пост)
если у предиката имя типа "and_pred"

частично согласен.. 

Цитата(boostcoder @  20.12.2010,  19:05 Найти цитируемый пост)
and_pred<...>()

не согласен с конструкцией..
 smile 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 20.12.2010, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  20.12.2010,  21:34 Найти цитируемый пост)
не согласен с конструкцией..

предлагаете шаблонный конструктор?
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0903 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.