前言
上一小节中,我们对stl
中的算法部分做了一个大致的说明。本小节我们将进入到其中关于数值算法的部分,都在stl_numeric.h
文件中。废话不多说,直接看源码吧。
stl_numeric
accumulate
注意该算法要求了迭代器的类型至少是InputIterator
类型,如果是OutputIterator
类型,肯定是不行的。
用于计算元素总和,init加上[first, last)范围内的元素之和。
template <class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init) {
/* 将[first, last)的值累加到init上
* 最后返回结果
*/
for ( ; first != last; ++first)
init = init + *first;
return init;
}
//这里多提供了一个BinaryOperation参数。之前是执行的求和运算,现在换成binary_op,对每个元素执行binary_op操作,换成减法、乘法都可以,但是并不建议换成违背函数本意的操作。
template <class InputIterator, class T, class BinaryOperation>
T accumulate(InputIterator first, InputIterator last, T init,
BinaryOperation binary_op) {
for ( ; first != last; ++first)
init = binary_op(init, *first);
return init;
}
inner_product
该函数用于计算[first1, last1)和[first2, first2 + (last1 - first1))的点积,最后加上init的值。
template <class InputIterator1, class InputIterator2, class T>
T inner_product(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, T init) {
//遍历[first1, last)以及[first2, first2 + (last1 - first1))
for ( ; first1 != last1; ++first1, ++first2)
init = init + (*first1 * *first2);
return init;
}
//该版本的inner_product不是执行init + (*fist1 ) * (*first2)操作,而是执行传入的binary_op1以及binary_op2操作
template <class InputIterator1, class InputIterator2, class T,