有没有办法用带有多个参数的函数调用std :: transform

时间:2010-11-15 10:30:14

标签: c++

你好,我有一个签名是

的功能

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);
}

如何以更优雅的方式完成这项工作?

亲切的问候 贝

3 个答案:

答案 0 :(得分:16)

您应该查看boost::bind,这将允许您(如名称所示)将[绑定]参数绑定到您的函数f

 std::transform([...], boost::bind(&f, _1, param1, param2, param3));

此绑定的结果是一元函数(_1是应该调用它的参数的占位符):所有其他参数将具有固定值param1param2param3

答案 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);

}