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;
        }