Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在<;功能性>;?_C++_Stl_Bind_Predicate - Fatal编程技术网

C++ 在<;功能性>;?

C++ 在<;功能性>;?,c++,stl,bind,predicate,C++,Stl,Bind,Predicate,我想用C++0x lambdas做的事情非常简单。我只想弄清楚如何只使用bind1st和bind2nd来完成它 我需要在向量v中找到第一个元素I,这样(I-1)/p1==p2,其中p1和p2是预定义的整数 find_if(v.begin(), v.end(), ???) 我不知道如何用减除等于和bind2nd构成谓词。好像我需要一些函数组合 equal(div(minus(i, 1), p1), p2) 可能吗 请不要建议解决方法,例如编写独立的一元函数或使用操作符()编写结构。我对泛函中的

我想用C++0x lambdas做的事情非常简单。我只想弄清楚如何只使用
bind1st
bind2nd
来完成它

我需要在向量
v
中找到第一个元素
I
,这样
(I-1)/p1==p2
,其中p1和p2是预定义的整数

find_if(v.begin(), v.end(), ???)
我不知道如何用
等于
bind2nd
构成谓词。好像我需要一些函数组合

equal(div(minus(i, 1), p1), p2)
可能吗


请不要建议解决方法,例如编写独立的一元函数或使用
操作符()编写结构。我对泛函中的函子力学以及
bind1st
bind2nd
非常感兴趣。这不是真正的代码,只是兴趣。谢谢:)

不幸的是,仅使用当前的
功能库是不可能做到的。您需要创建自己的类或函数来进行合成

Boost过去提供了一个用于编写类似函数的编写库,但我认为在引入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);
std::bind(std::equal_to(),/*…==P2*/
std::bind(std::divides(),/*…/P1==P2*/
绑定(std::减号(),_1,1),/*(x-1)/P1==P2*/
p1),
p2);

如果你能把等式左边的
i
拉上来,我想你不需要全部作曲<代码>即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 }
1#包括
2#包括
3#包括
4#包括
5使用名称空间标准;
6.
7 int main()
8 {
9
10个矢量数;
11表示(int i=0;i<10;i++){
12个数字。推回(i+20);
13     }
14
15 int p1=4,p2=5;
16向量:迭代器iter;
17
18 iter=find_if(numbers.begin()、numbers.end()、bind2nd(等于()、p1*p2+1));

19难道我从来没有见过叠加这个词被这样使用过吗?你用它来表示函数合成吗?@interjay:是的,我用过。叠加这个词在英语中不是用过吗?:(我得编辑一下,看起来你不能做
bind1st(bind2nd(…),…)
。这与数学中的方向不同,但见鬼。我知道,
(I-1)/p1==p2
并不等同于
I==p1*p2+1
,因为除法是整数除法:)感谢上帝在C++0x中使用了lambdas!