我正在嘗試解釋在Calculate mean and standard deviation from a vector of samples in C++ using Boost處發現的問題「使用提升計算C++中的樣本向量的平均值和標準差」的答案之一。bind <void>(ref(acc),_1)是什麼意思?
問題是關於如何使用boost來計算包含樣本的載體的平均值和標準偏差。 David Nehme給出的答案如下。
使用累加器是計算助力中平均值和標準差的方法。
accumulator_set<double, stats<tag::variance> > acc;
for_each(a_vec.begin(), a_vec.end(), bind<void>(ref(acc), _1));
cout << mean(acc) << endl;
cout << sqrt(variance(acc)) << endl;
有人可以解釋這個答案?它看起來有點像我的魔法咒語。
我不知道「bind(ref(acc),_1)」是什麼意思。通過閱讀www.boost.org/doc/libs/1_55_0/libs/bind/bind.html上的Boost綁定文檔,我可以假設bind指向boost :: bind,ref指向boost :: ref,_1指向boost \ bind \ placeholders.hpp中定義的_1佔位符對象。
但是,我不知道所有這些如何融合在一起。關於boost :: bind的文檔有點含糊。它討論使用boost :: bind和函數,但acc是一個變量。
for_each行到底是什麼?
我明白我失蹤了。在我剛纔閱讀文檔時,我沒有意識到以下操作符的重要性。 void operator()(參數常量&參數) 這是使acc成爲函數對象而不是簡單集合或向量的原因。現在這個神奇的咒語很有道理! –
@BenKey acc已經是一個函數對象,專門設計爲按原樣傳遞給std :: for_each(並從std :: for_each返回)。 – Cubbi
@kingtorus請注意,'ref'不僅僅是優化:語義是不同的,因爲即使bind-expression是函數也不會被複制。 – sehe