代码之家  ›  专栏  ›  技术社区  ›  BlueTrin

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

c++
  •  7
  • BlueTrin  · 技术社区  · 15 年前

    你好我有个函数签名是

    std::字符串f(double x,double param1,double param2,double param3);

    我想对参数x的std::vector xvalues调用它,对param1、param2和param3的特定值使用类似std::transform的方法。

    相当于:

    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 回复  |  直到 14 年前
        1
  •  16
  •   icecrime    15 年前

    你应该调查一下 boost::bind 它将允许您,如名称所示,将参数“绑定”到您的函数 f :

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

    此绑定的结果是一元函数( _1 作为应该用它调用的参数的占位符):所有其他参数都将具有固定值 param1 , param2 , param3 .

        2
  •  7
  •   Matthieu M.    15 年前

    为了完整起见,C++ 0x版本,或者 兰姆达斯有什么好大惊小怪的 ?

    std::transform([...], [=](double i){ return f(i, param1, param2, param3); });
    
        3
  •  3
  •   Naveen    15 年前

    正如冰原所暗示的 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);
    
    }