在functional>中有关于函数组合的东西吗?
Is there something for function composition in <functional>?
我想做的是很容易完成c++ 0x lambdas。我只是想弄清楚如何只处理bind1st
和bind2nd
。
我需要在向量v
中找到第一个元素i
,这样(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
非常感兴趣。这不是为了真正的代码,只是为了兴趣。谢谢:)
不幸的是,仅使用当前的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);
如果你可以在等式的左边拉出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的答案就是你的选择。
相关文章:
- 可组合的lambda/std::函数与std::可选
- 我需要将多个函数组合为一个函数
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- C++组合函数总是产生 0
- 组合函数参数包和默认参数
- 我在C++中使用提升哈希函数将 3 个双精度组合成一个面临冲突的哈希
- uncrustify:如何将多行 C 函数调用的参数组合到一行上?
- 如何将这两个函数组合成一个实现?
- 如何将两个代码组合成一个函数?
- 如何组合lambda,vairadic函数和函数指针?
- 使用Set/Get-like方法或GetSet组合函数
- 找不到如何创建使用指针、字符和 for 函数组合的程序
- 使用参数包在C++中组合 lambda 函数
- 使用类/函数模板组合进行意外诊断
- 将 libstdc++ 和其他函数组合到一个库中
- 如何在组合函数中使用 boost::asio::d efer()
- 2个模板构造函数的组合构建与变异模板.如何
- 按每个顺序测试每个函数组合
- 组合 std::vector 默认值和填充构造函数
- 我可以在C++中动态组合函数和类型吗?