首页 > 解决方案 > 如何更改参数名称?

问题描述

首先有vector一个大小为 20 的 a。我们将 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;



}

输出为:计数 = 20
总和 = 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);

标签: c++templatesvectorparameters

解决方案


#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:我没有得到你通过争论的东西。在评论中解释一下,也许我可以帮助你。


推荐阅读