2012-12-21 103 views
2

我有一個函數創建一組線性間隔的值。 。 。結合函子和lambda表達式

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

爲什麼還有可能調整我的最後一行代碼以使其工作?

回答

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對象,當前值被重置。

2

在第一種情況:

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

你有一個持久gen_lin對象,lin,是它和每次調用拉姆達更新。但是對於你的單線程,你只需要創建新的gen_lin對象,每次調用lambda時,都會得到它返回的第一個值,然後拋出對象。由於它是一個新對象,使用相同的常量值進行初始化,所以每次都會給出相同的值。

1

在第二種情況下,每個lamdas調用都會創建一個函子的新實例。

類似綁定的東西可能會解決您的問題。讓lambda把你的函數作爲一個參數,並使用綁定將一個常用的實例附加到該參數?

或者使用任何味道的組合函子。