stl中的adjacent_difference

先看实现:

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值