如何组合一些函子来生成`isOdd`函数?

时间:2011-03-20 09:13:55

标签: c++ stl

如何组合多个仿函数来生成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 =&gt; {0,2,4}

2 个答案:

答案 0 :(得分:2)

仅使用标准库中提供的原语,这实际上非常困难,因为bind1stbind2nd提供的绑定不允许您编写函数。在这种特殊情况下,您正在尝试检查是否

x % 2 == 1

如果您考虑<functional>原语如何工作,那么等同于

equal_to(modulus(x, 2), 1)

问题是<functional>中的组件不允许您将一个函数的输出作为输入传递给另一个函数非常容易。相反,你将不得不依赖其他一些技术。在这种情况下,您可以使用not1

的两个连续应用程序作弊
not1(not1(bind2nd(modulus<int>(), 2)))

这是有效的,因为它相当于

!!(x % 2)

如果x是偶数,则为!!0false,如果x为奇数,则为!!1,即true。通过not1进行双重过滤的原因是为了确保结果的类型为bool,而不是int,因为

bind2nd(modulus<int>(), 2)

是一个产生int而不是bool的函数。

答案 1 :(得分:2)

isOdd可以定义为:

bind2nd(modulus<int>(),2)