Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > как переделать цикл используя алгоритмы


Автор: korian 22.3.2008, 14:11
Код

class A
{
public:
    int foo(int a, double b);
}

typedef std::vector<A> AContainer;
AContainer vect;
int sum = 0;
int a = 10;
double b = 2.5;
for (AContainer::iterator iter = vect.begin(); iter != vect.end(); ++iter)
    sum += iter->foo(a, b);

как? и можно ли? записать такой же цикл с помощью алгоритмов (думаю for_each надо юзать), не добавляя новый класс (взякими binder1st, mem_fun и тд)

Автор: archimed7592 22.3.2008, 14:47
Код

std::for_each(vect.begin(), vect.end(), boost::lambda::var(sum) += boost::lambda::bind(&A::foo, boost::lambda::_1, a, b));

Со стандартными биндерами тоже можно, но лень расписывать и, BTW, как минимум понадобится helper-class подобный boost::reference_wrapper(если я не ошибаюсь).

Автор: UnrealMan 22.3.2008, 15:30
Цитата(archimed7592 @  22.3.2008,  14:47 Найти цитируемый пост)
boost::lambda::var(sum) += 

В случае += сгодится и просто sum.

Добавлено через 34 секунды
Цитата(archimed7592 @  22.3.2008,  14:47 Найти цитируемый пост)
Со стандартными биндерами тоже можно

Там нет функтора для +=

Автор: archimed7592 22.3.2008, 15:49
Цитата(UnrealMan @  22.3.2008,  15:30 Найти цитируемый пост)
Там нет функтора для += 

Да, действительно... Как и для =.

Автор: blinded 22.3.2008, 17:02
неправда, есть std::accumulate который BinaryOp

Автор: UnrealMan 22.3.2008, 18:29
Цитата(blinded @  22.3.2008,  17:02 Найти цитируемый пост)
неправда, есть std::accumulate который BinaryOp 

Однако такой BinaryOp всё равно не выразить средствами STL.

Автор: korian 22.3.2008, 18:59
я так понял, что основная проблема в том, что нельзя вызвать функцию класса с больше чем 1 параметрами.
std::accumulate - интересная штука, правда мне не понравилась, т.к. реализуется с помощью оператора +,
а это куча лишних копирований.

Автор: archimed7592 22.3.2008, 22:39
Цитата(korian @  22.3.2008,  18:59 Найти цитируемый пост)
я так понял, что основная проблема в том, что нельзя вызвать функцию класса с больше чем 1 параметрами.

Это не проблема. Проблема в том, что нет такого стандартного функтора, который изменяет операнд(= или +=) т.е. нужно писать "дополнительный класс", что противоречит условию
Цитата(korian @  22.3.2008,  14:11 Найти цитируемый пост)
не добавляя новый класс


Автор: comcon1 23.3.2008, 00:32
есть еще phoenix, он вроде - альтернатива к lambda. Я им в spirit для акторов юзался, но по логике, должен и сюда подходить.

Автор: UnrealMan 23.3.2008, 12:36
Цитата(korian @  22.3.2008,  18:59 Найти цитируемый пост)
я так понял, что основная проблема в том, что нельзя вызвать функцию класса с больше чем 1 параметрами.

Хотя бы поэтому. С помощью STL не забиндишь метод с двумя параметрами.

Добавлено через 1 минуту и 24 секунды
Цитата(archimed7592 @  22.3.2008,  22:39 Найти цитируемый пост)
Проблема в том, что нет такого стандартного функтора, который изменяет операнд(= или +=)

При использовании std::accumulate это не проблема smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)