你好,我有一个签名是
的功能std :: string f(double x,double param1,double param2,double param3);
我想在std :: vector xvalues上为参数x调用它,使用std :: transform作为param1,param2和param3的特定值。
这相当于:
double param1(1.);
double param2(1.1);
double param3(1.2);
std::vector<std::string> results();
for (std::vector<double>::const_iterator it = xvalues.begin() ; it != xvalues.end() ; ++xvalues)
{
results.push_back(f(*it, param1, param2, param3);
}
如何以更优雅的方式完成这项工作?
亲切的问候 贝
答案 0 :(得分:16)
您应该查看boost::bind,这将允许您(如名称所示)将[绑定]参数绑定到您的函数f
:
std::transform([...], boost::bind(&f, _1, param1, param2, param3));
此绑定的结果是一元函数(_1
是应该调用它的参数的占位符):所有其他参数将具有固定值param1
,param2
,param3
。
答案 1 :(得分:7)
为了完整起见,C ++ 0x版本,或关于lambdas的所有大惊小怪?
std::transform([...], [=](double i){ return f(i, param1, param2, param3); });
答案 2 :(得分:3)
正如icecrime建议boost::bind
将是最佳选择。但是,如果由于某种原因无法使用boost
,您可以随时使用这样的用户定义仿函数:
using namespace std;
string f(double x, double param1, double param2, double param3)
{
return string();
}
struct Caller
{
Caller(vector<string>& results) : m_res(results)
{
}
void operator()(double x)
{
m_res.push_back(f(x, 1.0,2.0,3.0));
}
private:
vector<string>& m_res;
};
int main()
{
vector<double> d;
vector<string> r;
d.push_back(1.0);
d.push_back(2.0);
Caller c(r);
for_each(d.begin(), d.end(), c);
}