小型的平均值

时间:2012-02-21 02:02:34

标签: c++

我想写一个通用的平均算法。也就是说,对于任何具有运算符+(T)和运算符/(浮点数)的类型T,我想在容器中找到T的平均值:

像这样的东西适用于float-ish类型:

template<typename T>
typename T::value_type RunningAverage(const T& v)
{
  typename T::value_type vectorRunningAverage = 0;

  for(unsigned int i = 0; i < v.size(); ++i)
    {
    vectorRunningAverage = (v[i] + i*vectorRunningAverage)/(i+1);
    }

  return vectorRunningAverage;
}

我可以改变

  typename T::value_type vectorRunningAverage = 0;

float vectorRunningAverage = 0;

然后它将使用类似unsigned char的类型(不能添加多个无符号字符并将结果存储在无溢出的unsigned char中),因为它可以隐式转换为float。但是,如果我有一些更复杂的类型(比方说我想平均std::vector<std::vector<unsigned char> >中的组件,这不起作用。是否有一些我缺少的东西?或者这样做是否有意义?

2 个答案:

答案 0 :(得分:2)

所以你需要的是以某种方式为你的类型T定义包含T的平均值的类型。

C ++特征提供干净且不引人注目的解决方案。

template <class T>
struct average
{
    typedef float type; // could be or could be not sane default, depends on the domain
};

然后,对于需要“调整”的类型,您只需为average<>模板提供专业化(部分或完整):

template <>
struct average<double>
{
    typedef double type; // want more precision
};

template <class T>
struct average<MyMegaType<T> >
{
    typedef MyMegaType<T>::value_type type;
};

比你的功能的sgnature可能

template<typename T>
typename average<T::value_type>::type RunningAverage(const T& v);

答案 1 :(得分:1)

我认为你应该让调用者明确提到所需的返回类型:

template<typename T, typename ResultT = typename T::value_type>
ResultT RunningAverage(const T& v);

我也认为你应该开始&amp;结束迭代器而不是整个容器,因为它会使你的函数更通用(例如,你可以获得向量的前半部分的平均值)。