最佳实践:如何改进对容器值求和的代码?

时间:2010-11-29 18:37:26

标签: c++ stl

我正在编写一个简单的函数,它迭代容器中的数字并计算一些汇总值(在这种情况下是熵)。

我希望尽可能将其编写为通用名称,以便它可以在不同的值类型(vector,{{}上使用不同的容器(setdouble,...) 1}},...),所以我这样做:

float

根据所有最佳实践,我对此代码的外观感兴趣。换句话说,这个小函数的STL实现到底是什么样的?

4 个答案:

答案 0 :(得分:4)

查看std :: transform和std :: accumulate

答案 1 :(得分:4)

template < typename T1, typename T2 >
T1 entropy_sum(T1 sum_so_far, T2 number)
{
  return sum_so_far - static_cast<T1>(number) * log(static_cast<T1>(number));
}
double entropy = std::accumulate(set.begin(), set.end(), 0.0, &entropy_sum<double, set_type::value_type>);

除了Value()可能不是合法声明之外,你的方法还可以。

编辑以反映评论。

答案 2 :(得分:4)

在C ++ 0x中,可以使用以下lambda版本:

template<class Iterator>
typename Iterator::value_type Entropy(Iterator begin, Iterator end) {
  typedef typename Iterator::value_type Value;
  return accumulate(begin, end, Value(), 
      [] (Value i, Value j)-> Value { return i - j * log(j); });  
}

答案 3 :(得分:2)

最好使用std::iterator_traits

typedef typename std::iterator_traits<Iterator>::value_type Value;

这允许Iterator成为指针。