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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Связыватели и бинарные функторы в STL, Не компилируется метод generate с bind2n 
:(
    Опции темы
ller
Дата 15.6.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

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



Код

generate(vi.begin(),vi.end(),bind2nd(plus<double>(),mn));

при компиляции выдет ошибку
Код

ошибка: не найден метод для преобразования в ‘(std::binder2nd<std::plus<double> >) ()’
замечание: претенденты: typename _Operation::result_type std::binder2nd<_Operation>::operator()(const typename _Operation::first_argument_type&) const [with _Operation = std::plus<double>]
замечание:              typename _Operation::result_type std::binder2nd<_Operation>::operator()(typename _Operation::first_argument_type&) const [with _Operation = std::plus<double>]


я так понимаю компилятор не может определить какой из bind2nd использовать или с const typename _Operation::first_argument_type& или с ypename _Operation::first_argument_type&...
как ему это объяснить, чего то не пойму. Хочу просто к каждому элементу вектора прибавить double mn.
PM MAIL   Вверх
azesmcar
Дата 16.6.2009, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



ller

А что надо сделать то? Функтор алгоритма generate не принимает параметров. Конечно не будет работать
в чем смысл кода? что надо сгенерировать?
PM   Вверх
Lazin
Дата 16.6.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



это можно сделать с помощью boost.bind, bind2nd тут не поможет
PM MAIL Skype GTalk   Вверх
ller
Дата 16.6.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

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



К каждому элементу вектора прибавить значение.
PM MAIL   Вверх
azesmcar
Дата 16.6.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



ller, 
Цитата(ller @  16.6.2009,  11:59 Найти цитируемый пост)
К каждому элементу вектора прибавить значение. 

Код

std::transform(vi.begin(), vi.end(), vi.begin(), std::bind2nd(std::plus<double>(), mn));

PM   Вверх
Lazin
Дата 16.6.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



std::for_each( vi.begin(), vi.end(), std::bind2nd( std::plus<double>(), mn ) );


Код

#include <boost/lambda/lambda.hpp>
...
std::for_each( vi.begin(), vi.end(), _1 += mn );



Код

#include <boost/foreach.hpp>
...
BOOST_FOREACH( double &d, vi )
{
    d += vi;
}


Это сообщение отредактировал(а) Lazin - 16.6.2009, 12:28
PM MAIL Skype GTalk   Вверх
zim22
Дата 16.6.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Lazin,  smile 
Цитата(Lazin @  16.6.2009,  12:04 Найти цитируемый пост)
std::for_each( vi.begin(), vi.end(), std::bind2nd( std::plus<double>(), mn ) );

for_each только для чтения контейнера, но не для записи



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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(zim22 @  16.6.2009,  12:07 Найти цитируемый пост)
for_each только для чтения контейнера, но не для записи

с чего ты это взял? smile 
PM MAIL Skype GTalk   Вверх
zim22
Дата 16.6.2009, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Lazin @  16.6.2009,  12:14 Найти цитируемый пост)
с чего ты это взял?

в школе имени Липпмана так учили smile
***
Цитата

Липпман "С++ вводный курс"
for_each(beg, end, f)
Функция (или объект  функции) f() применяется к каждому элементу в исходном диапазоне. Возвращаемое функцией f() значение (если оно есть) игнорирууется.
Используемые итераторы являются итераторами ввода, поэтому функция f() не может  записывать значения в элементы.

***
Школа Страуструпа:
Цитата

Алгоритм for_each() классифицируется как немодицицирующий, поскольку явно не изменяет последовательность. Тем не менее, будучи пременен к неконстантной последовательности, for_each() (через третий аргумент) может изменять её элементы. 


Это сообщение отредактировал(а) zim22 - 16.6.2009, 12:26


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


uploading...
****


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

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



Цитата(zim22 @  16.6.2009,  12:07 Найти цитируемый пост)
for_each только для чтения контейнера, но не для записи

for_each ни для чтения, ни для записи..for_each для итеративного вызова функтора. smile 
если дать ему такой функтор - можно модифицировать значения.
Код

struct changer : std::unary_function<int&, void>
{
    void operator()(int& r) const
    {
        r += 10;
    }
};

но в данном случае - std::for_each не сработает.


Это сообщение отредактировал(а) azesmcar - 16.6.2009, 12:20
PM   Вверх
Lazin
Дата 16.6.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



хотя обычно std::for_each применяется не для этого, но тем не менее, никто не запрещает с его помощью изменять данные контейнера smile

Добавлено через 3 минуты и 19 секунд
Цитата(azesmcar @  16.6.2009,  12:17 Найти цитируемый пост)
но в данном случае - std::for_each не сработает.

ну, это из-за передачи параметров по значению, но в целом, изменять данные с помощью for_each никто не запрещает
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 16.6.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



zim22

Цитата

25.1.1 For each [lib.alg.foreach]
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f);
1 Effects: Applies f to the result of dereferencing every iterator in the range [first, last), starting
from first and proceeding to last - 1.

в результате iterator dereferencing-а получается lvalue, который можно изменять smile 
PM   Вверх
zim22
Дата 16.6.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Код

void change(int &value) {
  value *= 10;
}

int ar[] = {10, 20, 30};
std::for_each(ar, ar + 3, change);

изменяются! smile 

Это сообщение отредактировал(а) zim22 - 16.6.2009, 12:34


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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