如何组合多个仿函数来生成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}
答案 0 :(得分:2)
仅使用标准库中提供的原语,这实际上非常困难,因为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
的函数。
答案 1 :(得分:2)
isOdd可以定义为:
bind2nd(modulus<int>(),2)