当前位置:嗨网首页>书籍在线阅读

13-数值运算

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

G.5.4 数值运算

表G.16对数值运算进行了总结,这些操作是由头文件numeric描述的。其中没有列出参数,而重载函数也只列出了一次。每一个函数都有一个使用<对元素进行排序的版本和一个使用比较函数对象对元素进行排序的版本。表后做了更详细的说明,其中包括原型。因此,可以浏览该表,以了解函数的功能;如果对某个函数非常感兴趣,则可以了解其细节。

表G.16 数值运算

| 函数 | 描述 | | :----- | :----- | :----- | :----- | | accumulate() | 计算区间中的值的总和 | | inner_product() | 计算2个区间的内部乘积 | | partial_sum() | 将使用一个区间计算得到的小计复制到另一个区间中 | | adjacent_difference() | 将使用一个区间的元素计算得到的相邻差集复制到另一个区间中 | | iota() | 将使用运算符++生成的一系列相邻的值赋给一个区间中的元素,这是C++11新增的 |

1.accumulate()

template <class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init);
template <class InputIterator, class T, class BinaryOperation>
T accumulate(InputIterator first, InputIterator last, T init,
             BinaryOperation binary_op);

accumulate()函数将acc的值初始化为init,然后按顺序对[first, last]区间中的每一个迭代器i执行acc = acc + i(第一个版本)或acc = binary_op(acc, i)(第二个版本)。然后返回acc的值。

2.inner_product()

template <class InputIterator1, class InputIterator2, class T>
T inner_product(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, T init);
template <class InputIterator1, class InputIterator2, class T,
class BinaryOperation1, class BinaryOperation2>
T inner_product(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, T init,
                BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);

inner_product()函数将acc的值初始化为init,然后按顺序对[first1, last1]区间中的每一个迭代器i和[first2, first2 + (last1−first1)]区间中对应的迭代器j执行acc = i j(第一个版本)或acc = binary_op(i, *j)(第二个版本)。也就是说,该函数对每个序列的第一个元素进行计算,得到一个值,然后对每个序列中的第二个元素进行计算,得到另一个值,依此类推,直到到达第一个序列的结尾(因此,第二个序列至少应同第一个序列一样长)。然后,函数返回acc的值。

3.partial_sum()

template <class InputIterator, class OutputIterator>
OutputIterator partial_sum(InputIterator first, InputIterator last,
                           OutputIterator result);
template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator partial_sum(InputIterator first, InputIterator last,
                           OutputIterator result,
                           BinaryOperation binary_op);

partial_sum()函数将first赋给result,将first + (first + 1)赋给(result + 1)(第一个版本),或者将binary_op(first, (first + 1))赋给(result + 1)(第二个版本),依此类推。也就是说,从result开始的序列的第n个元素将包含从first开始的序列的前n个元素的总和(或binary_op的等价物)。该函数返回结果的超尾迭代器。该算法允许result等于first,也就是说,如果需要,该算法允许使用结果覆盖原来的序列。

4.adjacent_difference()

template <class InputIterator, class OutputIterator>
OutputIterator adjacent_difference(InputIterator first, InputIterator last,
                                   OutputIterator result);
template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator adjacent_difference(InputIterator first, InputIterator last,
                                   OutputIterator result,
                                   BinaryOperation binary_op);

adjacent_difference()函数将first赋给result(result = first)。目标区间中随后的位置将被赋值为源区间中相邻位置的差集(或binary_op等价物)。也就是说,目标区间的下一个位置(result +1)将被赋值为(first + 1) - first(第一个版本)或binary_op((first + 1), * first)(第二个版本),依此类推。该函数返回结果的超尾迭代器。该算法允许result等于first,也就是说,如果需要,该算法允许结果覆盖原来的序列。

5.iota()(C++11)

template <class ForwardIterator, class T>
void iota(ForwardIterator first, ForwardIterator last,T value);

函数iota()将value赋给*first,再将value递增(就像执行运算++value),并将结果赋给下一个元素,依次类推,直到最后一个元素。