我想做的事情很容易用C ++ 0x lambdas完成。我只是想弄清楚如何只使用bind1st
和bind2nd
。
我需要在向量i
中找到第一个元素v
,这样(i-1)/p1 == p2
其中p1和p2是预定义的整数。
find_if(v.begin(), v.end(), ???)
我无法弄清楚如何使用minus<int>
divides<int>
equal_to<int>
和bind2nd
形成谓词。好像我需要一些功能组合
equal(div(minus(i, 1), p1), p2)
有可能吗?
请不要建议使用operator()
编写独立式一元函数或结构的变通方法。我对函数中的函子的机制以及bind1st
和bind2nd
非常感兴趣。这不是真正的代码,只是兴趣。谢谢:)
答案 0 :(得分:4)
不幸的是,只有当前的functional
库才能实现您的目标。您需要创建自己的类或函数来进行合成。
Boost用于提供一个Compose库,用于组成这样的函数,但我认为在引入Bind和Lambda时它已被删除。
只是为了完成,可以使用bind
使用以下内容完成:
std::bind(std::equal_to<int>(), /* ... == P2 */
std::bind(std::divides<int>(), /* ... / P1 == P2 */
std::bind(std::minus<int>(), _1, 1), /* (x - 1) / P1 == P2 */
p1),
p2);
答案 1 :(得分:0)
如果你可以在等式的左边拉出i
,那么我猜你不需要完全构图。 i.e. i == p1*p2+1
。
1 #include <iostream>
2 #include <functional>
3 #include <algorithm>
4 #include <vector>
5 using namespace std;
6
7 int main ()
8 {
9
10 vector<int> numbers;
11 for(int i = 0;i< 10;i++) {
12 numbers.push_back(i+20);
13 }
14
15 int p1=4,p2=5;
16 vector<int>::iterator iter;
17
18 iter = find_if ( numbers.begin(), numbers.end(), bind2nd(equal_to<int>(),p1*p2+1));
19 cout << "The number is "<< *iter <<"\n";
20 return 0;
21 }
但如果你坚持用你的表达方式作曲,那么@ dauphic的答案就是那个。