C++ 如何取一个向量的平均值,不管里面是什么?
我正在做一个家庭作业,要求我找到数据类的基本统计数据。我目前正在寻找平均值,但不确定如何设置它,因为给定文件的结构方式 我得到的是:C++ 如何取一个向量的平均值,不管里面是什么?,c++,C++,我正在做一个家庭作业,要求我找到数据类的基本统计数据。我目前正在寻找平均值,但不确定如何设置它,因为给定文件的结构方式 我得到的是: /* Copyright 2018 test_stat_tracker.cc */ #include <cstddef> // using size_t #include <iostream> using std::cout; using std::endl; #include <vector> using std::vect
/* Copyright 2018 test_stat_tracker.cc */
#include <cstddef>
// using size_t
#include <iostream>
using std::cout;
using std::endl;
#include <vector>
using std::vector;
#include "../hw7/stat_tracker.h"
using csce240::StatTracker;
const int kInt_elems[] = {1, 2, 1, 5, 7, 2, 9};
const size_t kInt_elem_count = 7;
const int kInt_elem_mean = 3; // actually 27/7
const int kInt_elem_median = 2;
const int kInt_elem_mode[] = {1, 2};
/* Calculates the actual mean, prints the expected and actual values, and
* returns whether they are the same.
*/
template <class T>
bool TestMean(const StatTracker<T>& tracker, const T& expected) {
T actual = tracker.Mean();
cout << "Expected mean: " << expected
<< ", Actual mean: " << actual;
return actual == expected;
}
void TestIntStats() {
vector<int> elems;
elems.assign(kInt_elems, kInt_elems + kInt_elem_count);
StatTracker<int> tracker;
for (auto it = elems.begin(); it != elems.end(); ++it)
tracker.Add(*it);
if (!TestMean(tracker, kInt_elem_mean))
cout << ": FAILED\n";
else
cout << ": PASSED\n";
}
int main(int argc, char* argv[]) {
TestIntStats();
return 0;
}
/*版权所有2018 test\u stat\u tracker.cc*/
#包括
//使用大小\u t
#包括
使用std::cout;
使用std::endl;
#包括
使用std::vector;
#包括“./hw7/stat_tracker.h”
使用csce240::StatTracker;
常量int kInt_elems[]={1,2,1,5,7,2,9};
常数大小与元素计数=7;
常数int kInt_elem_mean=3;//实际上是27/7
常数的中间值=2;
const int kInt_elem_mode[]={1,2};
/*计算实际平均值,打印预期值和实际值,以及
*返回它们是否相同。
*/
样板
布尔测试平均值(常数跟踪和跟踪器、常数T和预期){
T实际值=tracker.Mean();
cout这里有一些计算向量平均值的代码。
限制:
数据类型必须支持添加
数据类型必须支持分区
数据类型必须支持零赋值
守则:
template <typename Data>
Data Mean(const std::vector<Data>& v)
{
Data sum = 0;
const size_t length = v.length();
for (size_t i = 0; i < length; ++i)
{
sum += v[i];
}
return sum / length;
}
模板
数据平均值(常数标准::向量和v)
{
数据和=0;
const size_t length=v.length();
对于(尺寸i=0;i
这使用原语for
循环对向量中的元素求和
结果取决于数据类型的除法定义方式。例如,浮点将返回与整型不同的结果。我们要查看的代码数量惊人。您能否将其归结为一个更简单的示例来说明问题的确切性质?这看起来有点过于复杂o me.vector v=accumulate(v.begin(),v.end(),0)/v.size();
accumulate有一个严重的陷阱,返回类型是从最后一个参数推导出来的,因此不应该在那里使用0
(而且它不返回向量)我能找到的唯一elems
是其他方法的局部变量,我想StatTracker
应该保留数据的副本或引用以供分析。很高兴知道您有用于测试的函数,但我认为它们与问题无关,您能删除它们吗?请阅读
/* Copyright 2018
*
* stat_tracker.cc
*/
// #include "stat_tracker.h" // NOLINT
namespace csce240 {
template<class T>
const T StatTracker<T>::Mean() const {
auto v(elems);
vector<T> v = accumulate(v.begin(), v.end(), 0)/v.size();
return T();
}
} // namespace csce240
#include "stat_tracker.h"
template <typename Data>
Data Mean(const std::vector<Data>& v)
{
Data sum = 0;
const size_t length = v.length();
for (size_t i = 0; i < length; ++i)
{
sum += v[i];
}
return sum / length;
}