我有一个仿函数,可以创建一组线性间隔的值。 。 。
//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)() );} );
为什么,是否可以调整我的最后一行代码以使其正常工作?
答案 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将一个公共实例附加到该参数?
或者使用任何风格的组合函子。