需要的头文件:
numeric
源码:
//版本1
template <class _InputIterator, class _OutputIterator>
_OutputIterator
adjacent_difference(_InputIterator __first,
_InputIterator __last, _OutputIterator __result)
{
if (__first == __last) return __result;
*__result = *__first;
return __adjacent_difference(__first, __last, __result,
__VALUE_TYPE(__first));
}
template <class _InputIterator, class _OutputIterator, class _Tp>
_OutputIterator
__adjacent_difference(_InputIterator __first, _InputIterator __last,
_OutputIterator __result, _Tp*)
{
_Tp __value = *__first;
while (++__first != __last) {
_Tp __tmp = *__first;
*++__result = __tmp - __value;
__value = __tmp;
}
return ++__result;
}
//版本2
template <class _InputIterator, class _OutputIterator, class _BinaryOperation>
_OutputIterator
adjacent_difference(_InputIterator __first, _InputIterator __last,
_OutputIterator __result, _BinaryOperation __binary_op)
{
if (__first == __last) return __result;
*__result = *__first;
return __adjacent_difference(__first, __last, __result,
__VALUE_TYPE(__first),
__binary_op);
}
template <class _InputIterator, class _OutputIterator, class _Tp,
class _BinaryOperation>
_OutputIterator
__adjacent_difference(_InputIterator __first, _InputIterator __last,
_OutputIterator __result, _Tp*,
_BinaryOperation __binary_op) {
_Tp __value = *__first;
while (++__first != __last) {
_Tp __tmp = *__first;
*++__result = __binary_op(__tmp, __value);
__value = __tmp;
}
return ++__result;
}
作用:
用来计算[first,last)中相邻元素的差额。其过程为:
存储第一元素之值,然后存储后继两两相邻元素之差值
通过二元仿函数,我们可以将它一般化为:
存储第一元素之值,然后存储后继两两相邻元素之运算值
例子:
#include <numeric>
#include <vector>
#include <iostream>
#include <iterator>
using namespace std;
int main()
{
int ia[5] = { 1,2,3,4,5 };
vector<int> iv(ia, ia + 5);
//作为输出
ostream_iterator<int> oiter(cout, " ");
//输出iv元素间的差值
adjacent_difference(iv.begin(), iv.end(), oiter); //1 1 1 1 1
cout << endl;
//输出iv元素之间的两两相加的值
adjacent_difference(iv.begin(), iv.end(), oiter, [](int a, int b) {
return a + b;
});//1 3 5 7 9
cout << endl;
}
注意:
首先会存储第一元素之值
二元仿函数中,参数有先后。第一个参数代表前面的元素,第二个参数代表后面的元素