先看实现:
#include<iostream>
#include<numeric>
#include<vector>
#include<iterator>
using namespace std;
int main() {
int ia[5]= {1,2,3,4,5};
vector<int>iv(ia,ia+5);
ostream_iterator<int>oite(cout," ");
adjacent_difference(iv.begin(),iv.end(),oite);
//1,1,1,1,1
}
先看看stl中给的源码:
template<class InputIterator, class OutputIterator>
OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result){
if(first == last)return first;
*result = *first;
return __adjacent_difference(first, last, result, value_type(first));
//此处的value_type应该是stl源码中第三章traits“萃取”出来的类型
//侯捷老师认为此处可不需像上面那样调用,可改用以下写法:
if(first == last)return first;
*result = *first;
iterator_traits<InputIterator>::value value = *first; //这个萃取我自己实现了一下,在最后
while(++first != last){
//以下同__adjacent_diffence()的对应内容。
}
}
template <class InputIterator, class OutputIterator, class T>
OutputIterator __adjacent_difference(InputIterator first,InputIterator last,OutputIterator result, T*){
T value = *first;
while(++first != last){
T tmp = *first;
* ++result = tmp-value;
value = tmp;
}
return ++result;
}
我自己根据源码实现的adjacent_difference
template <class T>
struct Iterator_traits{ //通过traits萃取出T自己的value_type,即T::value_type。
typedef typename T::value_type value_type;
};
template<class InputIterator,class OutputIterator>
OutputIterator adjacent_difference1(InputIterator first,InputIterator last,OutputIterator result) {
if(first==last) return result;
*result = *first;
typedef typename Iterator_traits<InputIterator>::value_type value_type;
//此处的typename作用是告诉编译器Iterator_traits<InputIterator>::value_type 是一个类型,不是变量
value_type value=*first;
while(++first != last) {
InputIterator tmp = first;
*++result=*tmp-value;
value=*tmp;
}
return ++result;
}