【问题标题】:Combining functors and lambdas结合函子和 lambda
【发布时间】:2012-12-21 02:07:24
【问题描述】:

我有一个仿函数,它创建了一组线性间隔的值。 . .

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

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

【问题讨论】:

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


    【解决方案1】:

    这样,您将创建一个 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 对象时,当前值都会重置。

    【讨论】:

      【解决方案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 对象,获取它返回的第一个值,然后将对象扔掉。由于它是一个新对象,使用相同的常量值初始化,因此每次都会为您提供相同的值。

      【讨论】:

        【解决方案3】:

        在第二种情况下,每个 lamdas 调用都会创建一个新的仿函数实例。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-06
          • 2020-01-30
          • 1970-01-01
          • 1970-01-01
          • 2018-12-23
          • 1970-01-01
          • 2015-08-23
          • 1970-01-01
          相关资源
          最近更新 更多