在<functional>?</functional>中有什么功能组合

时间:2011-07-19 18:58:04

标签: c++ stl bind predicate

我想做的事情很容易用C ++ 0x lambdas完成。我只是想弄清楚如何只使用bind1stbind2nd

我需要在向量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()编写独立式一元函数或结构的变通方法。我对函数中的函子的机制以及bind1stbind2nd非常感兴趣。这不是真正的代码,只是兴趣。谢谢:)

2 个答案:

答案 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的答案就是那个。