经过几个小时的努力,终于解决了,本来就是想自己实现以下STL算法,学习下算法,没想到遇到个问题,这个问题就是当你使用STL traits编程技巧是有些函数的使用不到的,必须到源代码里面找,然后copy出来使用。
iterator 提供的方法里面没有iterator_category() 和 distance_type 所以去源代码里面cp来 哈哈
代码如下:
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
//关键就是这里了 哈哈 要自己加 否则不能自己扩展STL算法 就是不能使用下面2个模板函数
template <class Iterator>
inline typename iterator_traits<Iterator>::iterator_category
iterator_category(const Iterator&) {
typedef typename iterator_traits<Iterator>::iterator_category category;
return category();
}
template <class Iterator>
inline typename iterator_traits<Iterator>::difference_type*
distance_type(const Iterator&) {
return static_cast<typename iterator_traits<Iterator>::difference_type*>(0);
}
template<class ForwardIterator ,class T>
inline ForwardIterator lower_bound_myself( ForwardIterator first , ForwardIterator last, const T& value )
{
return __lower_bound_myself(first ,last , value ,distance_type(first),iterator_category(first));
}
template<class ForwardIterator ,class T,class Distance>
ForwardIterator
__lower_bound_myself(ForwardIterator first ,ForwardIterator last ,const T& value , Distance *, forward_iterator_tag)
{
Distance len = 0;
distance(first , last , len );
Distance half ;
ForwardIterator mid;
while( len > 0)
{
half = len >> 1;
mid = first;
advance(mid , half);
if ( *mid < value)
{
first = mid;
++first;
len = len - half - 1;
}
else
len = half ;
}
return first ;
}
template<class RandomAccessIterator, class T,class Distance>
RandomAccessIterator
__lower_bound_myself(RandomAccessIterator first ,RandomAccessIterator last ,const T& value , Distance *,random_access_iterator_tag)
{
Distance len = last - first ;
Distance half ;
RandomAccessIterator mid ;
while(len > 0)
{
half = len >> 1;
mid = first + half ;
if ( *mid < value )
{
first = mid + 1;
len -= half -1;
}
else
len = half ;
}
return first;
}
ps:其实也可以直接萃取型别
typedef typename iterator_traits<Iterator>::iterator_category category;
typedef typename iterator_traits<Iterator>::value_type T;
这样的话就可以使用T定义别的变量了