2016-04-01 32 views
3

boost docs給這個作爲boost::accumulate如何使用的一個示例:在C++ 11中更加優雅的助推積累?

// The data for which we wish to calculate statistical properties: 
std::vector<double> data(/* stuff */); 

// The accumulator set which will calculate the properties for us: 
accumulator_set< double, features< tag::tail<left> > > acc(
    tag::tail<left>::cache_size = 4); 

// Use std::for_each to accumulate the statistical properties: 
std::for_each(data.begin(), data.end(), bind<void>(ref(acc), _1)); 

是否有寫這個代碼與C++十四分之十一基於範圍環路或lambda表達式更優雅的方式?

+1

這段代碼應該做什麼? –

+0

跟蹤最小的4個值。尾巴描述在http://www.boost.org/doc/libs/1_60_0/doc/html/accumulators/user_s_guide.html#accumulators.user_s_guide.the_statistical_accumulators_library.tai​​l我的問題是更一般地關於累加器框架和for_each線儘管 –

回答

4

有兩種方法我能想到的,如下:

std::vector<double> data = {2.1, 2.2, 3.3, 4.4, 5.5}; 
accumulator_set< double, features< tag::tail<left> > > acc(tag::tail<left>::cache_size = 4); 

for_each(data.begin(), data.end(), [&acc](double y){ acc(y); }); 

std::vector<double> data = {2.1, 2.2, 3.3, 4.4, 5.5}; 
accumulator_set< double, features< tag::tail<left> > > acc(tag::tail<left>::cache_size = 4); 

for (auto y : data) 
    acc(y); 
0
std::vector<double> data = {2.1, 2.2, 3.3, 4.4, 5.5}; 
std::set<double> least; 
for (auto&& x:data) { 
    least.insert(decltype(x)(x)); 
    if (least.size() > 4) 
    least.erase(std::prev(least.end())); 
} 

在人物方面,基本相同的尺寸。而且因爲它使用衆所周知的基元,所以更容易閱讀和理解。

+0

看到不同之處會很有趣。我認爲它會以不同的運行時成本做不同的事情。 – sehe

+0

這處理尾巴,但正如我在評論中提到的,我一般對累加器框架更感興趣。代碼片段只是從文檔中提取的一個特定示例 –