Сначала есть vector
с размером 20. Мы присваиваем случайные числа от 0 до 100 для vector
. Затем, используя функцию шаблона, мы находим общее, среднее, медианное и стандартное отклонение элементов этого вектора. Код выглядит следующим образом, и вывод на экран ниже.
#include <numeric>
#include <cmath>
#include <algorithm>
#include <functional>
#include <vector>
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
template<int N, class T>
T nthPower(T x) {
T ret = x;
for (int i=1; i < N; ++i) {
ret *= x;
}
return ret;
}
template<class T, int N>
struct SumDiffNthPower {
SumDiffNthPower(T x) : mean_(x) { };
T operator( )(T sum, T current) {
return sum + nthPower<N>(current - mean_);
}
T mean_;
};
template<class T, int N, class Iter_T>
T nthMoment(Iter_T first, Iter_T last, T mean) {
size_t cnt = distance(first, last);
return accumulate(first, last, T( ), SumDiffNthPower<T, N>(mean)) / cnt;
}
template<class T, class Iter_T>
T computeVariance(Iter_T first, Iter_T last, T mean) {
return nthMoment<T, 2>(first, last, mean);
}
template<class T, class Iter_T>
T computeStdDev(Iter_T first, Iter_T last, T mean) {
return sqrt(computeVariance(first, last, mean));
}
template<class T, class Iter_T>
void computeStats(Iter_T first, Iter_T last, T& sum, T& mean,
T& var, T& std_dev)
{
size_t cnt = distance(first, last);
sum = accumulate(first, last, T( ));
mean = sum / cnt;
var = computeVariance(first, last, mean);
std_dev = sqrt(var);
}
int RandomNumber () { return (std::rand()%100); }
int main(int argc, char **argv) {
std::srand ( unsigned ( std::time(0) ) );
vector<int> v(20);
std::generate (v.begin(), v.end(), RandomNumber);
double sum, mean, var, dev;
computeStats(v.begin( ), v.end( ), sum, mean, var, dev);
cout << "count = " << v.size( ) << "\n";
cout << "sum = " << sum << "\n";
cout << "mean = " << mean << "\n";
cout << "variance = " << var << "\n";
cout << "standard deviation = " << dev << "\n";
cout << endl;
}
Вывод: count = 20
sum = 789
среднее = 39,45
дисперсия = 888,448
стандартное отклонение = 29.8068
Как изменить параметры? Я не хочу использовать этот стиль.
template<class T, class Iter_T>
T computeVariance(Iter_T first, Iter_T last, T mean) {
return nthMoment<T, 2>(first, last, mean);
}
Я хочу использовать этот способ для расчета вещей.
template<class T, class T2>
T computeVariance(vector<T2> &vec, T mean)
{
...
}
Все функции должны быть такими. Как это сделать?
В основной функции как использовать функцию генерации для копирования вектора и Как я могу отправить адреса аргументов
std::generate (v.begin(), v.end(), RandomNumber);
computeStats(v.begin( ), v.end( ), sum, mean, var, dev);