Как изменить имя параметра? - PullRequest
0 голосов
/ 22 апреля 2020

Сначала есть 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);

Ответы [ 2 ]

1 голос
/ 22 апреля 2020
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <functional>
#include <iostream>
#include <numeric>
#include <vector>

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 T2>
T nthMoment(vector<T2> &vec, T mean) {
    size_t cnt = vec.size();
    return accumulate(vec.begin(), vec.end(), T(), SumDiffNthPower<T, N>(mean)) / cnt;
}

template <class T, class T2>
T computeVariance(vector<T2> &vec, T mean) {
    return nthMoment<T, 2>(vec, mean);
}

template <class T, class T2>
T computeStdDev(vector<T2> &vec, T mean) {
    return sqrt(computeVariance(vec, mean));
}

template <class T, class T2>
void computeStats(vector<T2> &vec, T &sum, T &mean, T &var, T &std_dev) {
    size_t cnt = vec.size();
    sum = accumulate(vec.begin(), vec.end(), T());
    mean = sum / cnt;
    var = computeVariance(vec, 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, 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;
    return 0;
}

Надеюсь, это сработает. PS: я не получил твои доводы в пользу спора. Объясните это в комментариях, может быть, я могу помочь вам с этим.

0 голосов
/ 22 апреля 2020

вы можете иметь

template<class T, class T2>
T computeVariance(vector<T2> &vec, T mean)
{
    return nthMoment<T, 2>(vec.begin(), vec.end(), mean);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...