2014-02-12 80 views
1

我正在嘗試解釋在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行到底是什麼?

回答

1

我假設你明白什麼是迭代器; for_each需要一個起始迭代器,一個結束迭代器和一個函數,在該函數上調用與迭代器相關聯的對象。 std::for_each

  1. bind<void>(ref(acc),_1)是算符(或函數對象 - 可以把它像內部狀態的功能),它有一個雙鍵和返回任何 - 大約相當於void function(double));
  2. ref(acc)允許您最小化複製對象的懲罰;在這種情況下acc是一個累加器,它的定義中有以下函數operator()(double value);
  3. _1被稱爲佔位符(有點複雜,但請參閱placeholders) - 粗略地說,佔位符是一種將函數傳遞給函子的機制。
+0

我明白我失蹤了。在我剛纔閱讀文檔時,我沒有意識到以下操作符的重要性。 void operator()(參數常量&參數) 這是使acc成爲函數對象而不是簡單集合或向量的原因。現在這個神奇的咒語很有道理! –

+0

@BenKey acc已經是一個函數對象,專門設計爲按原樣傳遞給std :: for_each(並從std :: for_each返回)。 – Cubbi

+0

@kingtorus請注意,'ref'不僅僅是優化:語義是不同的,因爲即使bind-expression是函數也不會被複制。 – sehe