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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как переделать цикл используя алгоритмы 
V
    Опции темы
korian
Дата 22.3.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Код

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 и тд)


Это сообщение отредактировал(а) korian - 22.3.2008, 14:12
PM   Вверх
archimed7592
Дата 22.3.2008, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



Код

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(если я не ошибаюсь).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 22.3.2008, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 27
Всего: 32



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

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

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

Там нет функтора для +=
PM MAIL   Вверх
archimed7592
Дата 22.3.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



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

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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
blinded
Дата 22.3.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



неправда, есть std::accumulate который BinaryOp
PM MAIL   Вверх
UnrealMan
Дата 22.3.2008, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 27
Всего: 32



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

Однако такой BinaryOp всё равно не выразить средствами STL.
PM MAIL   Вверх
korian
Дата 22.3.2008, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



я так понял, что основная проблема в том, что нельзя вызвать функцию класса с больше чем 1 параметрами.
std::accumulate - интересная штука, правда мне не понравилась, т.к. реализуется с помощью оператора +,
а это куча лишних копирований.
PM   Вверх
archimed7592
Дата 22.3.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



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

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




--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
comcon1
Дата 23.3.2008, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



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


--------------------
PM MAIL   Вверх
UnrealMan
Дата 23.3.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 27
Всего: 32



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

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

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

При использовании std::accumulate это не проблема smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1301 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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