无论内部是什么,如何取向量的均值?

时间:2018-12-05 20:23:40

标签: c++

我正在处理一个作业问题,该问题需要我找到有关数据类的基本统计信息。我目前正在寻找均值,但是由于给定文件的结构方式,我不确定如何设置它。

这是给我的:

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

现在这是我在.h和.cc文件中管理的内容:

/* Copyright 2018
 *
 * stat_tracker.h 
 */    

#ifndef _HW7_STAT_TRACKER_H_  // NOLINT
#define _HW7_STAT_TRACKER_H_  // NOLINT
#include <ostream>
using std::cout;
using std::endl;
#include <vector>
#include <numeric>
using std::accumulate;

namespace csce240 {

template <class T>
class StatTracker  {
 public:
  const T Mean() const;  // T = T + T and T = T / int must be defined
  // T a, b; a += b; DON'T DO THIS
};
}  // namespace csce240

#include "../hw7/stat_tracker.cc"  // comment out

#endif /* _HW7_STAT_TRACKER_H_ */  // NOLINT 

还有我的.cc文件

/* 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"

此刻,我正在努力获取有效的方法,但是我不断收到未声明elems的错误。我无法在kInt_elems中初始化.cc,因为我的教授将使用他自己的具有不同编号的测试课程。

我很迷茫,需要一些如何设置此功能的指导。

1 个答案:

答案 0 :(得分:1)

这是一些计算向量均值的代码。 限制:

  1. 数据类型必须支持加法。
  2. 数据类型必须支持除法。
  3. 数据类型必须支持零分配。

代码:

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

这使用原始的for循环对向量中的元素求和。

结果取决于如何为数据类型定义除法。例如,浮点将返回与整数类型不同的结果。