0

我正在使用 STL,但我没有 c++0x,也无法使用 boost,我想知道在使用 std::generate 时是否有任何方式将 2 个或更多参数绑定到仿函数?就像是

#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 编译。顺便说一句,仅在 c++0x 和/或 c++11 中支持 std::bind 吗?

4

2 回答 2

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*/));
于 2013-08-24T03:23:44.697 回答
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 的优点是您可以编写您想要的代码,而无需定义结构的所有脚手架。

于 2013-08-24T03:41:35.980 回答