Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
#1

Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? - C++

29.01.2014, 11:08. Просмотров 1197. Ответов 37
Метки нет (Все метки)

Собственно назрел такой вопрос:
Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект?
Например, у нас имеется два массив. Требуется найти сумму их соответствующих элементов причем если некий элемент второго массива нечетный его следует удвоить.
Очевидно будем пользоваться алгоритмом transform. Предикат пусть будет plus. Вот теперь вопрос как его записать в данном случае?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2014, 11:08     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект?
Посмотрите здесь:

при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! C++
Объект osteram& или как его вывести в переменную ? C++
C++ Написать программу с использованием структуры, состоящей из переменных, определяющих объект
C++ Массив и классы (как передаётся объект: по значению или по ссылке?)
Как задать переменную в бинарном формате? (В шестнадцатиричном через Х, а бинарном?) C++
C++ Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно?
Может ли объект-член, или объект-элемент достучаться к содержащему его? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
30.01.2014, 15:03     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #21
Цитата Сообщение от Ilot Посмотреть сообщение
Jupiter, Tulosba
Свой функтор писать нельзя. Только с использованием стандартных бинарных функторов/предикатов.
Вы пожайлуста поймите, что я знаю как реализовать подобные вещи с помощью своего функтора. Вопрос в том как это реализовать для бинарных функторов из библиотеки STL.
Ну это идиотизм... у Вас что там секта поклонников STL ? STL не язык это инструмент.
Есть алгоритмы описывающие обобщенные случая и есть функтуры которые их уточняют, то есть описывают конкретный твой случай. Конкретный случай конечно реализовывать нужно именно тебе. Иначе в библиотеке было бы 1000 и 1 функтур.

Цитата Сообщение от Ilot Посмотреть сообщение
Хех... так и было... Но это же хорошо, что я изучаю исходники, а не только книжки читаю. В книгах очень много чего нет......
Как раз что так делать не надо, есть в книгах.
Читайте книги из раздела для начинающих из категории "level-up" (Дьюхерста,Саттера,Майерса).
DiffEreD
1427 / 764 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.01.2014, 15:16     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #22
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Может проще будет через bind:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main() {
 
    std::vector<int> v1 = {1,2,3,4};
    std::vector<int> v2 = {5,6,7,8};
 
    std::transform(v1.begin(), v1.end(), v2.begin(),
                   std::ostream_iterator<int>(std::cout, " "),
                   std::bind(std::plus<int>(),
                   std::placeholders::_1,
                   std::bind(std::multiplies<int>(), 2, std::placeholders::_2))
                   );
 
    return 0;
}
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
30.01.2014, 15:25  [ТС]     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #23
DiffEreD, вроде бы оно однако похоже прграмка работает не совсем правильно http://ideone.com/33jgCI
Должна быть последовательность 3 4 9 8 15 12 21 16 27
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.01.2014, 15:27     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #24
Цитата Сообщение от Ilot Посмотреть сообщение
вроде бы оно однако
так тут нет проверки на нечетность потому что.
DiffEreD
1427 / 764 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.01.2014, 15:28     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #25
С четностью еще не придумал как сделать.
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
30.01.2014, 15:35  [ТС]     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #26
Цитата Сообщение от DiffEreD Посмотреть сообщение
С четностью еще не придумал как сделать.
Это не важно. Ответ на вопрос получен.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
30.01.2014, 15:38     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #27
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ilot, наверное нужно больше биндов!
C++
1
2
3
4
5
6
7
8
9
10
std::bind(
      std::plus<int>()
   ,  std::placeholders::_1
   ,  std::bind(
            std::multiplies<int>()
          , std::placeholders::_2
          , std::bind(
                  std::plus<int>()
                , 1
                , std::bind(std::modulus<int>(), std::placeholders::_2, 2))))

Не по теме:

адъ

Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
30.01.2014, 15:47  [ТС]     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #28
Вроде как понятно, что пора учить новый стандарт...
DiffEreD
1427 / 764 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.01.2014, 15:53     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #29
gray_fox, у меня такая конструкция не компилируется (g++ 4.8.2).
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
30.01.2014, 15:56     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #30
DiffEreD, ну я не проверял, но конструкция должна получиться такая:
C++
1
_1 + _2 * (1 + _2 % 2)
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
30.01.2014, 16:16     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #31
Цитата Сообщение от gray_fox Посмотреть сообщение
адъ
Цитата Сообщение от Ilot Посмотреть сообщение
Вроде как понятно, что пора учить новый стандарт...
При чем ту стандарт к котлу и чертям ?

Нафига городить бинды, если можно нагородить лямбды?
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
30.01.2014, 16:28  [ТС]     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #32
Цитата Сообщение от Avazart Посмотреть сообщение
Нафига городить бинды, если можно нагородить лямбды?
Притом, что нужно читать о чем спрашивает автор темы. Со всем уважением, но вы этого как мне кажется не поняли. Я не хочу сказать, что конструкция с биндами будет лучше чем написать свой функтор. Однако это полный ответ на вопрос который я задал.
Цитата Сообщение от Avazart Посмотреть сообщение
При чем тут стандарт к котлу и чертям ?
Старый стандар не поддерживает ни bind ни placeholders.
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
30.01.2014, 16:38     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #33
Цитата Сообщение от Ilot Посмотреть сообщение
Старый стандар не поддерживает ни bind ни placeholders.
Цитата Сообщение от Ilot Посмотреть сообщение
Притом, что нужно читать о чем спрашивает автор темы. Со всем уважением, но вы этого как мне кажется не поняли. Я не хочу сказать, что конструкция с биндами будет лучше чем написать свой функтор. Однако это полный ответ на вопрос который я задал.
Так вы задаете странные вопросы, получаете соответствующие ответы.

Чем не угодили свои функтуры не понятно.

Цитата Сообщение от Ilot Посмотреть сообщение
Старый стандар не поддерживает ни bind ни placeholders.
Есть в Boost.
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
30.01.2014, 16:45  [ТС]     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #34
Цитата Сообщение от Avazart Посмотреть сообщение
Чем не угодили свои функтуры не понятно.
Есть такая вещь как любопытство. Мне стало интересно возможно ли то о чем я спросил или нет.
Цитата Сообщение от Avazart Посмотреть сообщение
Так вы задаете странные вопросы, получаете соответствующие ответы.
Нет. Просто бывает так, что человека стразу понять не всегда получается особенно когда он задает "странные вопросы". Просто вы и Jupiter не поняли вопроса, а другие люди поняли и оставим эту тему.
MrGluck
Ворчун
Эксперт CЭксперт С++
6675 / 3856 / 510
Регистрация: 29.11.2010
Сообщений: 10,215
30.01.2014, 21:30     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #35
а чем вариант Jupiter не соответствует заявленной в шапке темы вопросу? Просто и лаконично. Или у нас -std=c++98 ?
Цитата Сообщение от Ilot Посмотреть сообщение
имеется два массив. Требуется найти сумму их соответствующих элементов причем если некий элемент второго массива нечетный его следует удвоить.

Не по теме:

Jupiter,

C++
1
2
3
4
auto pred = [](int a, int b)
{
    return a + b*(1 + (b & 1));
};
же

Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.01.2014, 21:34     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #36
MrGluck, ну захотелось товарищу поиграть комбинацией стандартных функторов. Что уж тут поделать.
MrGluck
Ворчун
Эксперт CЭксперт С++
6675 / 3856 / 510
Регистрация: 29.11.2010
Сообщений: 10,215
30.01.2014, 21:41     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #37
Оказывается и функторы нельзя и буст нельзя и С++11 нельзя...
Что ж тогда можно то?
Не могу не написать: KISS

Добавлено через 52 секунды
Tulosba, причем функторов строго из functional и строго из С++98.

Добавлено через 2 минуты
Написал бы только об этом сразу...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2014, 22:08     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект?
Еще ссылки по теме:

C++ В некоторый момент программы нужно узнать, к какому классу принадлежит объект
C++ Разные размеры одной структуры в бинарном файле
Функциональный объект и подсчёт определённых значений в векторе C++
C++ Основы: указатель на объект или объект, что выбрать?
Как проверить является ли объект базовым классом или наследником C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
30.01.2014, 22:08     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #38
Цитата Сообщение от MrGluck Посмотреть сообщение
Что ж тогда можно то?
Только "Ад"..
Yandex
Объявления
30.01.2014, 22:08     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru