博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iterator_traits获取迭代器类型
阅读量:6847 次
发布时间:2019-06-26

本文共 2623 字,大约阅读时间需要 8 分钟。

结论: std::iterator_traits 用于Iterator类型

比如有这么一个需求,给随意的一个迭代器移动距离 , 伪代码:

template 
void move_iter(Iter& iter, Distance d){ if( iter is std::random_access_iterator_tag) //随机迭代器随意加减 iter +=d; else //别的迭代器 ....}

问题是如何判断一个迭代器类型 ,使用 iterator_traits;

前提 , 5种迭代器是继承关系 ,随意看一眼即可:

struct input_iterator_tag    {    // identifying tag for input iterators    };struct _Mutable_iterator_tag    {    // identifying tag for mutable iterators    };struct forward_iterator_tag    : input_iterator_tag, _Mutable_iterator_tag    {    // identifying tag for forward iterators    };....

看一下iterator_traits:

template
struct iterator_traits { // get traits from iterator _Iter typedef typename _Iter::iterator_category iterator_category; ... 还有一堆typedef的东西, 省略 }

iterator_traits 和 remove_reference 内部实现差不多, 只是一堆typedef ,主要用于获取类型;

先简单看一下iterator_traits 怎么用:

//太长了?     // iterator_traits
<迭代器类型>
::iterator_category //iterator_category 就是一个被typedef 的 5个结构体中的其中一个 cout << typeid(std::iterator_traits
::iterator>::iterator_category).name() << endl; cout << typeid(std::iterator_traits
::iterator>::iterator_category).name() << endl; /* 输出: struct std::bidirectional_iterator_tag struct std::random_access_iterator_tag*/

用于判断迭代器类型的就是iterator_category ,而他本身就是5种迭代器的其中一个;

接下来就可以修改第一份伪代码了 . 大致是这样:

template 
void move_iter(Iter& iter, Distance d){ if(typeid(std::random_access_iterator_tag) == typeid(std::iterator_traits
::iterator_category)) iter += d; else if ... ...}

用RTTI这类东西总是觉得,本来就可以在编译的时候完成的,干嘛非等到运行时;

在修改一下 , 下面代码用了哑元 , 3个重载的template function:

template 
void do_move_iter(Iter & iter, Dist d , std::random_access_iterator_tag) //随机迭代{ iter += d;}template
void do_move_iter(Iter & iter, Dist d , std::bidirectional_iterator_tag) //双向{ if( d>= 0){ while(d--) ++iter; } else { while(d++) --iter; }}template
void do_move_iter(Iter & iter, Dist d , std::input_iterator_tag) // forward继承了input;{ if( d < 0) throw std::out_of_range("d < 0"); while(d--) ++iter;}template
void move_iter(Iter& iter, Distance d){ do_move_iter(iter,d, std::iterator_traits
::iterator_category());}int main(){ vector
vi{1,2,3,4}; vector
::iterator iter = vi.begin(); //随机迭代器 move_iter(iter,2); //移动2个距离 cout << *iter << endl; //3. ok的}

转载地址:http://kflul.baihongyu.com/

你可能感兴趣的文章
Python爬虫实战(三):爬网易新闻
查看>>
前端总结
查看>>
java代理
查看>>
局域网内sqldeveloper客户端连接oracle服务器
查看>>
iOS开发:本地数据存储-NSUserDefaults
查看>>
8.tomcat认证访问
查看>>
专业PHP 7 IDE - Eclipse PDT 4.0 终于出世
查看>>
ArcGIS数据生产与精细化制图之中国年降水量分布图的制作
查看>>
ThinkPHP3.2.3扩展之生成PDF文件(MPDF)
查看>>
Atitit.常用的gc算法
查看>>
jquery练习(一次性赋予多个属性值)
查看>>
高山流水,知音难觅
查看>>
Xamarin.Forms XAML控件的公共属性
查看>>
理解Lucene中的Query
查看>>
Specified key was too long; max key length is 767 bytes
查看>>
TCP连接状态详解
查看>>
亿级Web系统搭建——单机到分布式集群
查看>>
[Redis]windows下redis的安装和启动
查看>>
推断某个值是否在某个范围汇编优化
查看>>
Servlet过滤器
查看>>