2

線形間隔の値のセットを作成するファンクターがあります。. .

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

これで、ラムダを使用してこれを対数スケールに簡単に変換できます...

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

しかし、すべてを 1 行にまとめようとすると、ベクトルは完全に logf(10.) の値で満たされます。

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

コードの最後の行を微調整して機能させることは可能ですか?

4

3 に答える 3

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 オブジェクトを作成するたびに、現在の値がリセットされます。

于 2012-12-21T02:14:58.340 に答える
2

最初のケースでは:

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

ラムダを呼び出すたびに更新される永続gen_linオブジェクトがあります。linしかし、ワンライナーではgen_lin、ラムダを呼び出すたびに新しいオブジェクトを作成し、返された最初の値を取得してから、オブジェクトを破棄しています。これは同じ定数値で初期化された新しいオブジェクトであるため、毎回同じ値が返されます。

于 2012-12-21T02:15:26.463 に答える
1

2番目のケースでは、各lamdas呼び出しにより、ファンクターの新しいインスタンスが作成されます。

バインドのようなもので問題が解決する場合があります。ラムダにファンクターを引数として取り、bindを使用してその引数に共通インスタンスをアタッチさせますか?

または、任意のフレーバーのコンポーズファンクターを使用します。

于 2012-12-21T02:19:44.893 に答える