结合仿函数和lambda

时间:2012-12-21 02:07:25

标签: c++ c++11 lambda functor

我有一个仿函数,可以创建一组线性间隔的值。 。 。

//Linear spaced generator
struct gen_lin {
    float mi, inc;
public:
    gen_lin(float _mi=1.f, float _inc=1.f) : mi(_mi), inc(_inc){};
    float operator()() {
        return  mi+=inc;
    }
};

我可以使用像这样的值填充向量...

const size_t elements = 400;
std::vector<float> x(elements);
std::generate_n(x.begin(), elements, gen_lin(10.f,5.f) );

现在,我可以使用像这样的lambda轻松将其转换为对数刻度......

auto lin = gen_lin(10.f,5.f);
std::generate_n(x.begin(), elements, [&](){return logf(lin());} );

但是当我尝试将它全部压缩到一行时,向量完全填充了logf(10。)的值。

std::generate_n(x.begin(), elements, [](){return logf(  gen_lin(10.f,5.f)() );} );

为什么,是否可以调整我的最后一行代码以使其正常工作?

3 个答案:

答案 0 :(得分:2)

有了这个,您将创建一个gen_lin对象,并多次使用它:

auto lin = gen_lin(10.f,5.f);
std::generate_n(x.begin(), elements, [&](){return logf(lin());} );

有了这个,你将创建几个gen_lin对象:

std::generate_n(x.begin(), elements, [](){return logf(  gen_lin(10.f,5.f)() );} );

每次创建新的gen_lin对象时,当前值都会重置。

答案 1 :(得分:2)

在第一种情况下:

auto lin = gen_lin(10.f,5.f);
std::generate_n(x.begin(), elements, [&](){return logf(lin());} );

你有一个持久的gen_lin对象lin,每次调用lambda都会更新。但是使用你的单行程序,你只需要每次调用lambda创建新的gen_lin对象,获取它返回的第一个值,然后抛弃对象。因为它是一个新的对象,用相同的常量值初始化,所以每次都会给你相同的值。

答案 2 :(得分:1)

每个lamdas调用在第二种情况下创建一个新的functor实例。

像bind这样的东西可能会解决你的问题。让lambda将你的functor作为参数并使用bind将一个公共实例附加到该参数?

或者使用任何风格的组合函子。