c++ - 如何更改参数名称?
问题描述
首先有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);
解决方案
#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:我没有得到你通过争论的东西。在评论中解释一下,也许我可以帮助你。
推荐阅读
- python - 如何使用 Paramiko 指定端口号
- scala - 使用许多嵌套案例类播放 JSON 错误
- unity3d - unity transform.localPosition ,如果 Parent 不在 0 位置,代码结果与编辑器变换位置不同?
- django - 如何使用基于类的视图将评论链接到帖子
- mysql - 如何编写 MySQL 事件脚本
- sql - Sqlite 不返回任何数据
- c# - 如何映射列表 c# --> proto3
- angular - 如何在 Angular 7 中使用复杂表存储到 Firebase
- android - 每次用户登录时,Facebook 登录都使用相同的帐户
- react-native - 反应本机 - 在ajax成功注册后重定向屏幕