我正在使用STL,但我没有c ++ 0x而且我不能使用boost,我想知道在使用std :: generate时是否还有两个或更多参数绑定到仿函数?像
这样的东西#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
float f(int x, float y, float z) {return x*(y+z);}
int main(void)
{
std:vector<int> v(100);
float x=1.2, y=-3.3;
generate(v.begin(), v.end(), bind3argu(f, _, x, y)); // something like this: '_' is from vector
// as suggested, I also try
generate(v.begin(), v.end(), std::bind(f, x, y));
return 0;
}
我尝试使用std :: bind,但它不能用g ++ 4.4.6编译。顺便说一下,std :: bind只支持c ++ 0x和/或c ++ 11吗?
答案 0 :(得分:0)
如果您打算使用仿函数,请尝试使用std::transform
。
float foo(float z) {
float x=1.2, y=-3.3;
return x*(y+z);
}
std::transform(v.begin(), v.end(), v.begin(), foo);
如何传递矢量值的真正问题。如果不是这样的话,std::bind
会很有用。
std::generate(v.begin(), v.end(), std::bind(f, x, y /*Any number of varaibales*/));
答案 1 :(得分:0)
你当然可以编写自己的仿函数来做你想做的事。
例如:(未经测试的代码,可能需要指针而不是引用)
struct Three {
Three ( float &x, float &y ) : x_(x), y_(y) {}
float operator ( float z ) const { /* do something with x_,y_ and z */ }
private:
float &x_;
float &y_;
};
然后你可以说:
float x=1.2, y=-3.3;
Three three ( x, y );
generate( v.begin(), v.end(), three );
bind1st,或boost :: bind或C ++ 11 lambdas的优点是你可以只编写你想要的代码而没有定义结构的所有脚手架。