关于扩展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定义别的变量了
- 关于扩展STL算法时如何使用traits编程技法!!!
- STL之traits编程技法
- STL之traits编程技法
- STL中的traits编程技法
- STL中traits编程技法
- STL三:Traits编程技法一
- 【深度探索STL】详解 traits 编程技法
- STL中迭代器概念与traits编程技法
- STL学习笔记(traits编程技法)
- STL源码-iterator traits编程技法
- STL源码-iterator traits编程技法(续)
- STL源码-iterator traits编程技法
- STL源码-iterator traits编程技法(续)
- STL中,traits编程技法+模板
- STL 迭代器概念及traits编程技法
- STL-迭代器和traits编程技法
- stl源码剖析之traits编程技法
- STL之迭代器与traits编程技法
- 构建大型互联网站,需要的技术
- 定律
- 验证视图状态 MAC 失败
- jQuery调用WebService详解(POST)
- 【学习】各著名网站的使用语言情况
- 关于扩展STL算法时如何使用traits编程技法!!!
- fafafatttttttttt
- STL sort算法技巧和基本排序算法实现
- 工具集合及使用方法
- 关于win7_iis报500.19和500.21错误的解决方法
- 调色板的原理
- js实现树形菜单效果
- vistor模式
- C++读取文件所有内容+写一个新文件