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

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

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

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

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

Собственно назрел такой вопрос:
Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект?
Например, у нас имеется два массив. Требуется найти сумму их соответствующих элементов причем если некий элемент второго массива нечетный его следует удвоить.
Очевидно будем пользоваться алгоритмом transform. Предикат пусть будет plus. Вот теперь вопрос как его записать в данном случае?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2014, 11:08     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект?
Посмотрите здесь:
C++ Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно?
Функциональный объект и подсчёт определённых значений в векторе C++
C++ В некоторый момент программы нужно узнать, к какому классу принадлежит объект
Как задать переменную в бинарном формате? (В шестнадцатиричном через Х, а бинарном?) C++
C++ Разные размеры одной структуры в бинарном файле
Найти и вывести на экран продукты одной фирмы в бинарном файле C++
C++ Найти в бинарном файле все пары точек, лежащих с точкой d на одной прямой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
518 / 348 / 53
Регистрация: 11.09.2013
Сообщений: 1,995
29.01.2014, 11:29     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #2
Цитата Сообщение от Ilot Посмотреть сообщение
бинарном предикате

Не по теме:

а можно узнать что это такое?))

Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
29.01.2014, 11:38  [ТС]     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #3
Цитата Сообщение от dzrkot Посмотреть сообщение
а можно узнать что это такое?))
Это бинарный функтор который возвращает булево значение. Т.е. некоторые алгоритмы требуют бинарные функторы(transform), а некоторые предикаты (equal, mismatch и т.д.)
dzrkot
zzzZZZ...
518 / 348 / 53
Регистрация: 11.09.2013
Сообщений: 1,995
29.01.2014, 11:40     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #4
Цитата Сообщение от Ilot Посмотреть сообщение
Это бинарный функтор который возвращает булево значение. Т.е. некоторые алгоритмы требуют бинарные функторы(transform), а некоторые предикаты (equal, mismatch и т.д.)
спасибо, хотя всёравно понял не особо, погуглю потом)
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,279
Записей в блоге: 17
29.01.2014, 12:08     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #5
Цитата Сообщение от Ilot Посмотреть сообщение
Очевидно будем пользоваться алгоритмом transform. Предикат пусть будет plus. Вот теперь вопрос как его записать в данном случае?
std::accumulate применяется суммирования по одному контейнеру.
std::transform для преобразование элементов опять же для одного контейнера ( результат записывается в другой).

В вашем случае как мне кажется нужно писать свой алгоритм.
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
29.01.2014, 12:17  [ТС]     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #6
Avazart, спасибо конечно, но вопрос стоял в том как передать в бинарный функтор объект функции к одному из аргументов.
Почему возник такой вопрос - к примеру приведенный алгоритм вполне просто реализуется. Например, так:
C++
1
2
for (int iter = 0; iter < SIZE; ++iter)
    arr3[iter] = arr1[iter] + (arr2[iter]%2) ? arr2[iter]: 2 * arr2[iter];
Заметим, что в данном случае временный объект не создается. А вот если применять сперва алгоритм transform с неким функтором, а затем суммировать элементы то в итоге получится, что мы проходим по второму массиву дважды и перезаписываем исходный (либо заносим во временный массив). С циклом for такого нет - он более оптимальный. Так вот как подобный алгоритм записать с помощью одного алгоритма STL и бинарного предиката?
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,279
Записей в блоге: 17
29.01.2014, 12:41     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #7
Цитата Сообщение от Ilot Посмотреть сообщение
ак вот как подобный алгоритм записать с помощью одного алгоритма STL и бинарного предиката?
Никак, насколько я помню нет алгоритмов для двух контейнеров, нужно писать свой алгоритм.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.01.2014, 13:55     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #8
Цитата Сообщение от Ilot Посмотреть сообщение
Так вот как подобный алгоритм записать с помощью одного алгоритма STL и бинарного предиката?
C++
1
2
3
4
5
6
auto pred = [](int a, int b)
{
    return a + ((b % 2 != 0) ? b * 2 : b);
};
    
std::transform(std::begin(arr1), std::end(arr1), std::begin(arr2), res, pred);
если же 2-й массив нужно менять то в предикат 2-й параметр передаем по ссылку и меняем
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
30.01.2014, 08:50  [ТС]     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #9
Цитата Сообщение от Avazart Посмотреть сообщение
Никак, насколько я помню нет алгоритмов для двух контейнеров, нужно писать свой алгоритм.
Еще раз - transform. Вот например реализация. в моем компиляторе
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  template<typename _InputIterator, typename _OutputIterator,
       typename _UnaryOperation>
    _OutputIterator
    transform(_InputIterator __first, _InputIterator __last,
          _OutputIterator __result, _UnaryOperation __unary_op)
    {
      for ( ; __first != __last; ++__first, ++__result)
    *__result = __unary_op(*__first);
      return __result;
    }
  template<typename _InputIterator1, typename _InputIterator2,
       typename _OutputIterator, typename _BinaryOperation>
    _OutputIterator
    transform(_InputIterator1 __first1, _InputIterator1 __last1,
          _InputIterator2 __first2, _OutputIterator __result,
          _BinaryOperation __binary_op)
    {
      for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
    *__result = __binary_op(*__first1, *__first2);
      return __result;
    }

Jupiter, эмм... конечно благодарю за отзывчивость, но у меня как бы проблем с написанием функторов нет. К тому же я бы реализовал его ближе к реализации STL. Хотя бы так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
namespace std
{
  template <class _Tp>
    struct MyFunctor : public binary_function<_Tp, _Tp, _Tp>
    {
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x + ((__y % 2)? __y * 2: __y); }
    };
}

Однако вопрос стоял не в этом.
Вобщем малось помозговав пришел к выводу - в подобных ситуациях решение только через свои функторы или предикаты.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.01.2014, 09:45     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #10
Хотя бы так:
кто вам дал право размещать код в std? Начинать идентификаторы с подчёркивания...фу
Croessmah
30.01.2014, 10:27
  #11

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
Начинать идентификаторы с подчёркивания...фу
тут двойное подчеркивание...

DU
30.01.2014, 10:52
  #12

Не по теме:

двойное подчеркивание - это подчеркивание, начинающееся с подчеркивания
типа зарезервированы такие вещи. но даже если и нет, то выглядит не особо.
зачем оно, если можно без.

Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
30.01.2014, 11:01     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #13
Цитата Сообщение от DU Посмотреть сообщение
так и не нашел кнопочку для этого
Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект?
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
30.01.2014, 11:58  [ТС]     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #14
Цитата Сообщение от Jupiter Посмотреть сообщение
кто вам дал право размещать код в std? Начинать идентификаторы с подчёркивания...фу
Ну да, ну да и не одного слова по существу темы...
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,279
Записей в блоге: 17
30.01.2014, 12:25     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #15
Цитата Сообщение от Ilot Посмотреть сообщение
Вобщем малось помозговав пришел к выводу - в подобных ситуациях решение только через свои функторы или предикаты.
Ну так а как вы ожидали? Что кто-то за вас напишет функтуры? При чем на все случаи жизни ?

Добавлено через 4 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
кто вам дал право размещать код в std? Начинать идентификаторы с подчёркивания...фу
Да вероятно человек посмотрел в исходники STL своего компилятора и решил что ему тоже так позволено делать.
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
30.01.2014, 12:37  [ТС]     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #16
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так а как вы ожидали? Что кто-то за вас напишет функтуры? При чем на все случаи жизни ?
Мда... похоже это моя вина, что не доходчиво объяснил суть вопроса...
Постараюсь объяснить чуть более поробнее. Пусть имеем бинарный функтор, например:
C++
1
2
3
4
5
6
7
  template <class _Tp>
    struct plus : public binary_function<_Tp, _Tp, _Tp>
    {
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x + __y; }
    };
Вопрос как записать передачу функтора в алгоритм, что бы он работал например вот так:
C++
1
2
3
4
5
6
7
  template <class _Tp>
    struct myplus : public binary_function<_Tp, _Tp, _Tp>
    {
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x + funktor(__y); }
    };
Где funktor(..) есть некий унарный функтор.

Цитата Сообщение от Avazart Посмотреть сообщение
Да вероятно человек посмотрел в исходники STL своего компилятора и решил что ему тоже так позволено делать.
Хех... так и было... Но это же хорошо, что я изучаю исходники, а не только книжки читаю. В книгах очень много чего нет......

Добавлено через 4 минуты
Хотя в принципе я уже сам начинаю понимать, что это не возможно....
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.01.2014, 13:59     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #17
Цитата Сообщение от Ilot Посмотреть сообщение
сам начинаю понимать, что это не возможно....
Может быть как-то так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <algorithm>
#include <iostream>
#include <functional>
#include <vector>
 
template <class T>
struct twicer : std::unary_function<T,T>
{
    T operator()( const T& t ) const { return t * 2; }
};
 
template <class _Tp, class FT>
struct myplus : public std::binary_function<_Tp, _Tp, _Tp>
{
  _Tp operator()(const _Tp& __x, const _Tp& __y) const
  { return __x + funktor(__y); }
  
  FT funktor;
};
 
int main() {
    
    std::vector<int> v = {1,2};
    
    std::cout << std::accumulate( v.begin(), v.end(), 0, myplus<int,twicer<int> >() ) << std::endl;
    //std::cout << std::accumulate( v.begin(), v.end(), 0, std::plus<int>() ) << std::endl;
    
    return 0;
}
http://ideone.com/52wsbF

Если я правильно понял.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.01.2014, 14:38     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #18
Цитата Сообщение от Ilot Посмотреть сообщение
Вопрос как записать передачу функтора в алгоритм, что бы он работал например вот так:
ну так и вложи одно в другое
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <algorithm>
 
template<class T, template<class> class F>
struct foo
{
    foo() {}
    
    foo(const F<T>& f) : mF(f) {}
    
    T operator () (const T& a, const T& b)
    {
        return a + mF(b);
    }
    
    F<T> mF;
};
 
template<class T>
struct bar
{
    T operator () (const T& value)
    {
        return ((value % 2 != 0) ? value * 2 : value);
    }
};
 
int main() 
{
    int arr1[] = { 0, 1, 2, 3, 4 };
    int arr2[] = { 5, 6, 7, 8, 9 };
    int res[5];
    
    std::transform(arr1, arr1 + 5, arr2, res, foo<int, bar>());
    
    for (int i = 0; i < 5; ++i)
        std::cout << res[i] << ' ';
    
    return 0;
}
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
30.01.2014, 14:44  [ТС]     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #19
Jupiter, Tulosba
Свой функтор писать нельзя. Только с использованием стандартных бинарных функторов/предикатов.
Вы пожайлуста поймите, что я знаю как реализовать подобные вещи с помощью своего функтора. Вопрос в том как это реализовать для бинарных функторов из библиотеки STL.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2014, 15:00     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект?
Еще ссылки по теме:
при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! C++
Объект osteram& или как его вывести в переменную ? C++
Как проверить является ли объект базовым классом или наследником C++
C++ Массив и классы (как передаётся объект: по значению или по ссылке?)
C++ Написать программу с использованием структуры, состоящей из переменных, определяющих объект

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.01.2014, 15:00     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? #20
Цитата Сообщение от Ilot Посмотреть сообщение
Вопрос в том как это реализовать для бинарных функторов из библиотеки STL.
Чтобы каждый элемент с нечетным значением умножался на 2 при сложении?
И при этом итоговый функтор был комбинацией стандартных из этого списка?
Yandex
Объявления
30.01.2014, 15:00     Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект?
Ответ Создать тему
Опции темы

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