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总结相关推荐

  1. 迭代器——STL关键所在

    迭代器基本介绍: STL的设计中心思想在于:将容器和算法分开,彼此独立设计,最后再以一个胶合剂连接在一起.而算法和数据容器的泛型化从技术角度来说并不难实现,而如何将两者联系起来才是问题的关键所在.而迭 ...

  2. C++ 模板元编程简介

    文章目录 1.概述 2.模板元编程的作用 3.模板元编程的组成要素 4.模板元编程的控制逻辑 4.1 if 判断 4.2 循环展开 4.3 switch/case 分支 5.特性.策略与标签 6.小结 ...

  3. 读书笔记 effective c++ Item 47 使用traits class表示类型信息

    STL主要由为容器,迭代器和算法创建的模板组成,但是也有一些功能模板.其中之一叫做advance.Advance将一个指定的迭代器移动指定的距离: 1 template<typename Ite ...

  4. C++高阶必会操作--模板元编程

    泛型编程大家应该都很熟悉了,主要就是利用模板实现"安全的宏",而模板元编程区别于我们所知道的泛型编程,它是一种较为复杂的模板,属于C++的高阶操作了,它最主要的优点就在于把计算过程 ...

  5. 最好的 C++ 模板元编程干货!

    链接 | https://www.cnblogs.com/liangliangh/p/4219879.html 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能 ...

  6. C 语言版stl: CSTL

    啥都不说,先上代码 static void vector_array_test(void) {VECTOR v;ARRAY a;int aa[5];int b = 0;VECTOR_INIT(v, i ...

最新文章

  1. 创业者周鸿祎前传(西安交大时期)
  2. 华为USG Firewall Ipsec L2L
  3. Flask部署和分发
  4. 机器人学中的一些概念3——雅克比矩阵
  5. CF429E Points and Segments(欧拉回路)
  6. container_of深入理解
  7. Java多线程学习四十三:
  8. curses.h: No such file or directory
  9. rake matlab,[MATLAB毕业设计] rake 仿真程序 求助
  10. 通过YYtext实现文本点击(类似微博效果)
  11. 郭盛华动真格了!新公司获百亿融资,网友:还招人不
  12. 桥本分数式(蓝桥杯)
  13. XMAN选拔赛官方Writeup
  14. 在Illustrator和手绘文章中创建矢量图形
  15. 心不动——王阳明最可怕之处
  16. 论文笔记:Parallel Tracking and Verifying: A Framework for Real-Time and High Accuracy Visual Tracking...
  17. iOS 客户端基于 WebP 图片格式的流量优化(下)
  18. mysql8对gis的支持
  19. 小软件公司的生存之道
  20. react项目中使用阿里播放器播放视频,包括切换视频,播放定时跳转(兼容ios和andro),播放完成

热门文章

  1. CF763D·Timofey and a flat tree
  2. 论文文献管理工具——Zotero
  3. FTP服务器,部署YUM仓库,NFS共享服务
  4. Linux erlang 源码编译安装
  5. Excel发货单计算器,实现新增行后,新增行自动求和和列自动汇总求和
  6. JSON解释及语法规则
  7. 数据中台数据分析过程梳理
  8. java什么是局部与全局变量_Java中的局部VS全局变量
  9. java找不到java.dll(两种情况)
  10. 常见分布式ID生成方案