C++ 在<;功能性>;?
我想用C++0x lambdas做的事情非常简单。我只想弄清楚如何只使用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) 可能吗 请不要建议解决方法,例如编写独立的一元函数或使用操作符()编写结构。我对泛函中的
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!