Iterator_trait总结
1. 从STL源码中了解Iterator_trait
以rotate算法为例
template<typename _ForwardIterator>
inline void rotate(_ForwardIterator _first,_ForwardIterator _middle,_ForwardIterator _last,)
{//...std::_rotate(_first, _middle, _last,std::__iterator_category(_first));
}
template<typename _Iter>
inline typename iterator_trait<_Iter>::iterator_category __iterator_category(const _Iter&)
{return typename iterator_traits<_Iter>::iterator_category();
}
template<typename _RandomAccessIterator>
void _rotate(_RandomAccessIterator _first,_RandomAccessIterator _middle,_RandomAccessIterator _last,random_access_iterator _tag)
{//....typdef typename iterator_trait<_RandomAccessIterator>::different_type _Distance;typdef typename iterator_trait<_RandomAccessIterator>::value_type _VlaueType;_Distance_n = _last - _first;_Distance_k = _middle - _first;// ....for(;;) {//....}
}
从上述代码中可以看出,rotate()需要知道iterators的三个associated types,即:
- iterator_trait::iterator_category()
- iterator_trait<_RandomAccessIterator>::different_type __Distance
- iterator_trait<_RandomAccessIterator>::value_type _VlaueType
Iterators必须有能力回答algorithms的提问,这样的提问在C++标准库开发过程中设计出了5种,另外2种从未在C++标准库中被使用过:reference和pointer。
注:typedef typename 的作用
typdef typename iterator_trait<_RandomAccessIterator>::different_type _Distance;
typedef创建了存在类型的别名,而typename告诉编译器iterator_trait<_RandomAccessIterator>::different_type是一个类型而不是一个成员。
2. Iterator的5种associated types
// G4.9
template<typename _Tp>
struct _List_iterator
{typedef std::bidirectional_iterator_tag iterator_category;typedef _Tp value_type;typedef _Tp* pointer;typedef _Tp& reference;typedef ptrdiff_t difference_type;
}
如上所示,如果 I(iterator)是 class,class iterator 都有能力定义自己的associated type,因此以直接回答算法提问。
template<typename I>
inline void algorithm(I first, I last)
{//...I::iterator_category;I::pointer;I::reference;I::value_type;I::difference_type;//...
}
如果 I(iterator) 并不是 class,例如它是一个 native pointer(被视为一种退化的iterator),它无法定义自己的associated type,因此并不能回答算法的提问。traits 必须具有分别它获取的 iterator 是 class iterator T 还是native pointer to T。利用partial specialization可达到目的。
3. Itreator_trait源码实现
template <class T>
struct iterator_traits {typedef typename I::iterator_category iterator_category;typedef typename I::value_type value_type;typedef typename I::difference_type difference_type;typedef typename I::pointer pointer;typedef typename I::reference reference;
};template <class T>
struct iterator_traits<T*> {typedef typename random_access_iterator_tag iterator_category;typedef typename T value_type;typedef typename ptrdiff_t difference_type;typedef typename T* pointer;typedef typename T& reference;
};template <class T>
struct iterator_traits<const T*> {typedef typename random_access_iterator_tag iterator_category;typedef typename T value_type;typedef typename ptrdiff_t difference_type;typedef typename T* pointer;typedef typename T& reference;
};
注:const T*类型的Iterator中value_type不是const T,value_type的主要目的是用来声明变量,声明一个无法被复制的变量没有什么用。
Iterator_trait总结相关推荐
- 迭代器——STL关键所在
迭代器基本介绍: STL的设计中心思想在于:将容器和算法分开,彼此独立设计,最后再以一个胶合剂连接在一起.而算法和数据容器的泛型化从技术角度来说并不难实现,而如何将两者联系起来才是问题的关键所在.而迭 ...
- C++ 模板元编程简介
文章目录 1.概述 2.模板元编程的作用 3.模板元编程的组成要素 4.模板元编程的控制逻辑 4.1 if 判断 4.2 循环展开 4.3 switch/case 分支 5.特性.策略与标签 6.小结 ...
- 读书笔记 effective c++ Item 47 使用traits class表示类型信息
STL主要由为容器,迭代器和算法创建的模板组成,但是也有一些功能模板.其中之一叫做advance.Advance将一个指定的迭代器移动指定的距离: 1 template<typename Ite ...
- C++高阶必会操作--模板元编程
泛型编程大家应该都很熟悉了,主要就是利用模板实现"安全的宏",而模板元编程区别于我们所知道的泛型编程,它是一种较为复杂的模板,属于C++的高阶操作了,它最主要的优点就在于把计算过程 ...
- 最好的 C++ 模板元编程干货!
链接 | https://www.cnblogs.com/liangliangh/p/4219879.html 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能 ...
- C 语言版stl: CSTL
啥都不说,先上代码 static void vector_array_test(void) {VECTOR v;ARRAY a;int aa[5];int b = 0;VECTOR_INIT(v, i ...
最新文章
- 创业者周鸿祎前传(西安交大时期)
- 华为USG Firewall Ipsec L2L
- Flask部署和分发
- 机器人学中的一些概念3——雅克比矩阵
- CF429E Points and Segments(欧拉回路)
- container_of深入理解
- Java多线程学习四十三:
- curses.h: No such file or directory
- rake matlab,[MATLAB毕业设计] rake 仿真程序 求助
- 通过YYtext实现文本点击(类似微博效果)
- 郭盛华动真格了!新公司获百亿融资,网友:还招人不
- 桥本分数式(蓝桥杯)
- XMAN选拔赛官方Writeup
- 在Illustrator和手绘文章中创建矢量图形
- 心不动——王阳明最可怕之处
- 论文笔记:Parallel Tracking and Verifying: A Framework for Real-Time and High Accuracy Visual Tracking...
- iOS 客户端基于 WebP 图片格式的流量优化(下)
- mysql8对gis的支持
- 小软件公司的生存之道
- react项目中使用阿里播放器播放视频,包括切换视频,播放定时跳转(兼容ios和andro),播放完成