C++?Boost?Accumulators累加器詳細(xì)講解
Boost.Accumulators 提供了處理樣本的類。例如,您可以找到最大或最小的樣本,或者計算所有樣本的總和。雖然標(biāo)準(zhǔn)庫支持其中一些操作,但 Boost.Accumulators 還支持統(tǒng)計計算,例如均值和標(biāo)準(zhǔn)差。
該庫稱為 Boost.Accumulators,因?yàn)槔奂悠魇且粋€基本概念。累加器是一個容器,每次插入一個值時都會計算出一個新的結(jié)果。該值不一定存儲在累加器中。相反,累加器在輸入新值時不斷更新中間結(jié)果。
Boost.Accumulators 包含三個部分:
- 框架提供了庫的整體結(jié)構(gòu)。它提供類 boost::accumulators::accumulator_set,它總是與 Boost.Accumulators 一起使用。雖然您需要了解這個類和框架中的其他一些類,但細(xì)節(jié)并不重要,除非您想開發(fā)自己的累加器。頭文件 boost/accumulators/accumulators.hpp 使您可以訪問 boost::accumulators::accumulator_set 和框架中的其他類。
- Boost.Accumulators 提供了許多執(zhí)行計算的累加器。一旦包含 boost/accumulators/statistics.hpp,您就可以訪問和使用所有這些累加器。
- Boost.Accumulators 提供運(yùn)算符,例如,將一個 std::complex 類型的復(fù)數(shù)與一個 int 值相乘或?qū)蓚€向量相加。頭文件 boost/accumulators/numeric/functional.hpp 定義了 std::complex、std::valarray 和 std::vector 的運(yùn)算符。您不需要自己包含頭文件,因?yàn)樗诶奂悠鞯念^文件中。但是,您必須定義宏 BOOST_NUMERIC_FUNCTIONAL_STD_COMPLEX_SUPPORT、BOOST_NUMERIC_FUNCTIONAL_STD_VALARRAY_SUPPORT 和 BOOST_NUMERIC_FUNCTIONAL_STD_VECTOR_SUPPORT 以使運(yùn)算符可用。
Boost.Accumulators 提供的所有類和函數(shù)都在 boost::accumulators 或嵌套命名空間中定義。例如,所有累加器都在 boost::accumulators::tag 中定義。
示例 58.1。使用 boost::accumulators::tag::count 計數(shù)
#include <boost/accumulators/accumulators.hpp> #include <boost/accumulators/statistics.hpp> #include <iostream> using namespace boost::accumulators; int main() { accumulator_set<int, features<tag::count>> acc; acc(4); acc(-6); acc(9); std::cout << count(acc) << '\n'; }
示例 58.1 使用 boost::accumulators::tag::count,這是一個簡單的累加器,用于計算傳遞給它的值的數(shù)量。因此,由于傳遞了三個值,此示例將 3 寫入標(biāo)準(zhǔn)輸出。要使用累加器,您需要訪問類 boost::accumulators::accumulator_set,這是一個模板,它期望將要處理的值的類型作為其第一個參數(shù)。示例 58.1 將 int 作為第一個參數(shù)傳遞。
第二個參數(shù)指定要使用的累加器。您可以使用多個累加器。類名 boost::accumulators::accumulator_set 表示可以管理任意數(shù)量的累加器。
嚴(yán)格來說,您指定的是特征,而不是累加器。特征定義了應(yīng)該計算什么。你決定什么,而不是如何。功能可以有不同的實(shí)現(xiàn)。實(shí)現(xiàn)是累加器。
示例 58.1 使用 boost::accumulators::tag::count 選擇一個計算值的累加器。如果存在多個可以計算值的累加器,Boost.Accumulators 會選擇默認(rèn)的累加器。
請注意,您不能將特征直接傳遞給 boost::accumulators::accumulator_set。您需要使用 boost::accumulators::features。
boost::accumulators::accumulator_set 類型的對象可以像函數(shù)一樣使用。可以通過調(diào)用 operator() 來傳遞值。它們會立即得到處理。傳遞的值必須與作為第一個模板參數(shù)傳遞給 boost::accumulators::accumulator_set 的類型相同。
對于每個特征,都有一個同名的提取器。提取器接收累加器的當(dāng)前結(jié)果。示例 58.1 使用提取器 boost::accumulators::count()。傳遞的唯一參數(shù)是 acc。 boost::accumulators::count() 返回 3。
示例 58.2。使用均值和方差
#include <boost/accumulators/accumulators.hpp> #include <boost/accumulators/statistics.hpp> #include <iostream> using namespace boost::accumulators; int main() { accumulator_set<double, features<tag::mean, tag::variance>> acc; acc(8); acc(9); acc(10); acc(11); acc(12); std::cout << mean(acc) << '\n'; std::cout << variance(acc) << '\n'; }
示例 58.2 使用兩個特征 boost::accumulators::tag::mean 和 boost::accumulators::tag::variance 來計算五個值的均值和方差。該示例將 10 和 2 寫入標(biāo)準(zhǔn)輸出。
方差為 2,因?yàn)?Boost.Accumulators 為五個值中的每一個分配了 0.2 的權(quán)重。使用 boost::accumulators::tag::variance 選擇的累加器使用權(quán)重。如果未明確設(shè)置權(quán)重,則所有值都具有相同的權(quán)重。
示例 58.3。計算加權(quán)方差
#include <boost/accumulators/accumulators.hpp> #include <boost/accumulators/statistics.hpp> #include <iostream> using namespace boost::accumulators; int main() { accumulator_set<double, features<tag::mean, tag::variance>, int> acc; acc(8, weight = 1); acc(9, weight = 1); acc(10, weight = 4); acc(11, weight = 1); acc(12, weight = 1); std::cout << mean(acc) << '\n'; std::cout << variance(acc) << '\n'; }
示例 58.3 將 int 作為第三個模板參數(shù)傳遞給 boost::accumulators::accumulator_set。此參數(shù)指定權(quán)重的數(shù)據(jù)類型。在此示例中,權(quán)重分配給每個值。
Boost.Accumulators 使用 Boost.Parameter 以名稱/值對的形式傳遞附加參數(shù),例如權(quán)重。權(quán)重的參數(shù)名稱是權(quán)重。您可以將參數(shù)視為變量并分配一個值。名稱/值對作為附加參數(shù)在每個值之后傳遞給累加器。
在示例 58.3 中,值 10 的權(quán)重為 4,而所有其他值的權(quán)重為 1。均值仍然是 10,因?yàn)闄?quán)重對均值無關(guān)緊要。但是,方差現(xiàn)在是 1.25。與前面的示例相比,它有所減少,因?yàn)橹虚g值的權(quán)重高于其他值。
Boost.Accumulators 提供了更多的累加器。它們的用法與本章介紹的累加器相同。該庫的文檔包含對所有可用累加器的概述。
到此這篇關(guān)于C++ Boost Accumulators累加器詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++ Boost Accumulators內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++中memset,memcpy的使用及fill對數(shù)組的操作
這篇文章主要介紹了C/C++中memset,memcpy的使用及fill對數(shù)組的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12C語言基于循環(huán)鏈表解決約瑟夫環(huán)問題的方法示例
這篇文章主要介紹了C語言基于循環(huán)鏈表解決約瑟夫環(huán)問題的方法,簡單描述了約瑟夫環(huán)問題并結(jié)合實(shí)例形式分析了C語言使用循環(huán)鏈表解決約瑟夫環(huán)問題的具體操作技巧,需要的朋友可以參考下2018-01-01

C++實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲

如何利用C語言實(shí)現(xiàn)最簡單的HTTP服務(wù)器詳解

Cocos2d-x UI開發(fā)之菜單類使用實(shí)例