关于扩展STL算法时如何使用traits编程技法!!!

来源:互联网 发布:淘宝怎么上掌柜热卖 编辑:程序博客网 时间:2024/05/02 02:37
经过几个小时的努力,终于解决了,本来就是想自己实现以下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定义别的变量了