Как я могу объединить некоторые функторы для генерации функции isOdd? - PullRequest
1 голос
/ 20 марта 2011

Как объединить несколько функторов для генерации isOdd функтора?

equal_to

modulus

bind2nd

...

int nums[] = {0, 1, 2, 3, 4};
vector<int> v1(nums, nums+5), v2;
remove_copy_if(v1.begin(), v1.end(), back_inserter(v2), isOdd);

v2 => {0, 2, 4}

Ответы [ 2 ]

2 голосов
/ 20 марта 2011

isOdd может быть определено как:

bind2nd(modulus<int>(),2) 
2 голосов
/ 20 марта 2011

Используя только примитивы, предоставленные в стандартных библиотеках, это на самом деле удивительно сложно, потому что связующие, предоставляемые bind1st и bind2nd, не позволяют вам составлять функции. В данном конкретном случае вы пытаетесь проверить, если

x % 2 == 1

Что, если учесть, как работают примитивы <functional>, эквивалентно

equal_to(modulus(x, 2), 1)

Проблема в том, что компоненты в <functional> не позволяют очень легко передавать выходные данные одной функции в качестве входных данных для другой функции. Вместо этого вам придется полагаться на какую-то другую технику. В этом случае вы можете обмануть, используя два последовательных приложения not1:

not1(not1(bind2nd(modulus<int>(), 2)))

Это работает, потому что это эквивалентно

!!(x % 2)

Если x четное, то это !!0, что составляет false, а если x нечетное, это !!1, что составляет true. Причина двойной фильтрации через not1 состоит в том, чтобы гарантировать, что результат имеет тип bool, а не int, так как

bind2nd(modulus<int>(), 2)

- это функция, которая выдает int вместо bool, который вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...