我正在编写一个简单的函数,它迭代容器中的数字并计算一些汇总值(在这种情况下是熵)。
我希望尽可能将其编写为通用名称,以便它可以在不同的值类型(vector
,{{}上使用不同的容器(set
,double
,...) 1}},...),所以我这样做:
float
根据所有最佳实践,我对此代码的外观感兴趣。换句话说,这个小函数的STL实现到底是什么样的?
答案 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成为指针。