std::input_iterator_tag, std::output_iterator_tag,std::forward_iterator_tag, std::bidirectional_iterator_tag,std::random_access_iterator_tag

C++
迭代器库

在头文件  <iterator> 中定义
   
     
struct input_iterator_tag { };
   
     
struct output_iterator_tag { };
   
     
struct forward_iterator_tag : public input_iterator_tag { };
   
     
struct bidirectional_iterator_tag : public forward_iterator_tag { };
   
     
struct random_access_iterator_tag : public bidirectional_iterator_tag { };
   
     

定义迭代器的分类。这些标签都是空的类型,分别对应五种迭代器分类中的一种:

  • input_iterator_tag 对应 InputIterator.
  • output_iterator_tag 对应 OutputIterator.
  • forward_iterator_tag 对应 ForwardIterator.
  • bidirectional_iterator_tag 对应 BidirectionalIterator.
  • random_access_iterator_tag 对应 RandomAccessIterator.

顾名思义,迭代器分类标签可以用以标示某个迭代器的分类,可以根据这一分类所要求的特性来选择最优算法。

每一个迭代器类型都有对应的 std::iterator_traits<Iterator>::iterator_category 类型定义,即这五种类型之一。

#include <iostream>
#include <vector>
#include <list>
#include <iterator>template< class BDIter >
void alg(BDIter, BDIter, std::bidirectional_iterator_tag)
{std::cout << "alg() called for bidirectional iterator\n";
}template <class RAIter>
void alg(RAIter, RAIter, std::random_access_iterator_tag)
{std::cout << "alg() called for random-access iterator\n";
}template< class Iter >
void alg(Iter first, Iter last)
{alg(first, last,typename std::iterator_traits<Iter>::iterator_category());
}int main()
{std::vector<int> v;alg(v.begin(), v.end());std::list<int> l;alg(l.begin(), l.end());//    std::istreambuf_iterator<char> i1(std::cin), i2;
//    alg(i1, i2); // compile error: no matching function for call
}

typedef input_iterator_tag iterator_category 这些都是什么意思?相关推荐

  1. [转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法

    本文从三方面总结迭代器   迭代器的思想   迭代器相应型别及traits思想   __type_traits思想 一 迭代器思想 迭代器的主要思想源于迭代器模式,其定义如下:提供一种方法,使之能够依 ...

  2. STL学习_配接器篇

    STL学习_配接器篇 定义 配接器(Adapter)在STL组件的灵活组合运用功能上,扮演着轴承.转换器的角色.它事实上是一种设计模式.即将一个class的接口转换为另一个class的接口,使原本因接 ...

  3. stream iterators源代码详解

    所谓stream iterators,可以将迭代器绑定到一个stream(数据流)对象身上.绑定istream对象(例如:std:cin),称为 istream_iterator,拥有输入能力.乍听之 ...

  4. 使用traits技术表现迭代器类型 iterator_category

    1.STL的迭代器类型标识,和容器中的迭代器类型. 2.使用trait技术实现stl的advance功能. 3.迭代器trait中的其他类型定义. 1.STL的迭代器类型标识,和容器中的迭代器类型. ...

  5. C语言小知识:typedef\函数模板\

    (1)typedef用法: typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等).在编程中使用t ...

  6. Typedef用法(转载)

    在C的学习过程中,现在才发现,以前有那么多被忽略的重点:现在是慢慢拾起这些重点的时候,通过百度和博客,我感觉我学到了很多东西,自己只是在别人说的基础上,按照自己学习的过程在这里记录一下,以后有时间回过 ...

  7. C语言中的typedef

    typedef 的讲解与应用实例 前言:我们学过C语言的人都应该听过,或者说学过,甚至说用过typedef,多多少少都对其有所了解.不过就算没听过也没关系,我们一起来探讨一下. 阐述:typedef ...

  8. typedef用法小结

    Typedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法.不管怎样,使用 typedef 能为代码带来意想不到的好处,通过本文你可以学习用 typedef 避免缺欠,从而使代码更健壮 ...

  9. typedef与#define宏区别

    先让我们了解一下typedef的功能,typedef简单来说就是给类型取一个别名: 如 typedef int New   那么int就有一个别名叫New了,以后size就和int这个类型一共用法了. ...

最新文章

  1. python使用joblib模块保存和加载机器学模型
  2. curl的速度为什么比file_get_contents快以及具体原因
  3. CentOS下软件的安装
  4. 利用cx_Freeze将py文件打包成exe文件(图文全解)
  5. 桥接模式、NAT模式、仅主机模式理解
  6. Shell 编程进阶笔记
  7. 学习进度条——第八周
  8. SAP Spartacus User form属性的运行时字段明细
  9. BugkuCTF-Crypto题MathEnglish
  10. idea背景颜色修改
  11. 曾经的荣誉,偶然被唤醒
  12. BlowFish算法Java实现
  13. 【CV/Matlab系列】基于图像处理的苹果质量检测和分级系统【含Matlab源码】
  14. Python:whl文件是神?如何安装whl文件?
  15. 【一句日历】2019年3月
  16. Spring Boot 3.0.0正式发布,Banner不再支持图片增强可观测性
  17. Windows系统下安装配置 MinGW-w64 开发环境
  18. 2021福建省安全员官方 判断题题库及答案
  19. 解决 报错ora-04098: oracle trigger 触发器无效且未通过重新验证
  20. 试题 E: 玩具蛇(C/C++)

热门文章

  1. 2022高教社杯数学建模思路 - 案例:AdaBoost 算法
  2. 《A Definitive Guide to Apache ShardingSphere》海外正式上市
  3. python中用pandas读写excel表格,根据关键字查找填表(类似vlookpup)
  4. 金融机构的数据中台-恒生电子
  5. 利用生成函数求斐波那契数列通项公式
  6. 【介绍一下泛型擦除】什么是泛型擦除?
  7. 会议签到二维码制作教程
  8. 把导航栏和图片无缝连接
  9. 差分定位中控软件_无人机中的RTK差分定位技术解析,不懂得来科普吧
  10. 几种常用防反接电路的的分析,比较详细了