本节主要总结迭代器的设计原则,以及iterstor traits的设计作用

1、迭代器遵循的原则

迭代器是算法和容器的桥梁,它是类模板的设计,迭代器必须有能力回答算法提出的问题才能去搭配该算法的使用

1.1 算法使用迭代器示例

示例展示了rotate算法的,rotate(begin,middle,end),将区间[beg,end)内的元素进行旋转,执行后middle成为新的第一元素;

1.2 深刻分析迭代器的associated types

C++标准规定,所有的迭代器必须提供5种相关类型(associated types):

  • iterator-category:迭代器的类型,标准库提到了5中迭代器类型

    

  迭代器的分类:所有的sequence container都可以看作是连续空间(deque不是真正的连续空间),都是可以跳跃访问的,Array、vector、qeque都属于random_access_iterator_tag,list是双向链表属于bidirectional_iterator_tag,forward_list是单向链表属于farward_iterator_tag,set\map\multiset\multimap底层是红黑树,底层是双向链表,所以属于didirectional_itertator_tag,不定序容器,unordered set\unordered map等底层是用hash table(是由很多篮子组成的,每个篮子又挂一个链表,所以,由链表决定迭代器的分类验证时单向链表),验证结果如下:

  • value_type:迭代器的数据类型,放入的是哪种迭代器;
  • difference_type:两个迭代器间的距离;
  • pointer:迭代器的指针(算法目前没有使用);
  • reference:迭代器的引用(算法目前没有使用);

1.3 迭代器对于class和自然指针的处理

  在前面例子中,我们以list为例展示了迭代器的5种关联类型用于回答算法的提问,比如说value_type,它回答的是迭代器中放入元素的类型,但是对于放入的是C中的自然指针或者是class,迭代器又是怎么区分的呢?

  对于放入的class,迭代器可以直接回答,但是如果放入的是指针,指针是无法回答迭代器的5个提问的,这个时候就需要一种中间层来统一处理并作出回答,就有个traits的实现,对class和指针进行不同的处理。

1.4 迭代器的traits(萃取机)是如何工作的

  萃取机是为了回答迭代器中的5中相关类型而设计的,其中区分指针和class是通过偏特化实现的

  萃取机实现源码如下:

C++标准库分析总结(三)——<迭代器设计原则>的更多相关文章

  1. C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

    本节主要总结标准库Deque的设计方法和特性以及相关迭代器内部特征 1.Deque基本结构 Deque(双向队列)也号称连续空间(其实是给使用者一个善意的谎言,只是为了好用),其实它使用分段拼接起来的 ...

  2. C++标准库分析总结(四)——<Vector、Array、Forward_list设计原则>

    本节主要总结标准库Vector和Array的设计方法和特性以及相关迭代器内部特征 1.Vector 1.1 Vector 内部实现 Vector是自增长的数组,其实在标准库中没有任何一种容器能原地扩充 ...

  3. C++标准库类型vector及迭代器iterator简介

    Vector是C++标准库类型,称为容器,一个容器中的所有对象必须是同一种类型的.与数组相比,其最大的优点就是动态增长.Vector是一个类模板,并不是数据类型,而vector<int>和 ...

  4. C++标准库分析总结(八)——<仿函数、适配器、istream_iterator、ostream_iterator、bind>

    一.仿函数定义 仿函数是STL中最简单的部分,存在的本质就是为STL算法部分服务的,一般不单独使用.仿函数(functors)又称为函数对象(function objects),虽然函数指针虽然也可以 ...

  5. C++标准库分析总结(一)

    之前学习过标准库,最近身边有人问到相关话题,故在此做一个总结 1 标准库介绍 C++标准库:C++ Standard Library C++标准模板库:Standard Template Librar ...

  6. golang标准库分析之net/rpc

    net/rpc是golang提供的一个实现rpc的标准库.

  7. CNN结构演变总结(三)设计原则

    CNN结构演变总结(一)经典模型 CNN结构演变总结(二)轻量化模型 前言: 前两篇对一些经典模型和轻量化模型关于结构设计方面的一些创新进行了总结,在本文将对前面的一些结构设计的原则,作用进行总结. ...

  8. 大型Java进阶专题(三) 软件架构设计原则(下)

    前言 ​ 今天开始我们专题的第二课了,本章节继续分享软件架构设计原则的下篇,将介绍:接口隔离原则.迪米特原则.里氏替换原则和合成复用原则.本章节参考资料书籍<Spring 5核心原理>中的 ...

  9. C++标准库分析总结(六)——<Map、Multimap、Set、Multiset设计原则>

    关联容器我们可以看做是一个小型的数据库,它就是用key找value,编译器底层对于关联容器的实现有两种:红黑树(Red-Block tree)和哈希表(hash table,散列表). 一.红黑树简单 ...

随机推荐

  1. AJAX with JSP and Servlet(代码)

    欢迎任何形式的转载,但请务必注明出处. 本章内容来自YouTube需翻墙(点击进入视频学习) 服务器配置等可以参看我其他文章.注释等后续再加 效果图 结构   <body> <fie ...

  2. Java 之 字节输出流[OutputStream]

    一.字节输出流 java.io.OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地. 该类中定义了字节输出流的基本共性功能方法. 公性方法: public v ...

  3. Fortify漏洞之Open Redirect(开放式重定向)

    继续对Fortify的漏洞进行总结,本篇主要针对  Open Redirect(开放式重定向)  的漏洞进行总结,如下: 1.1.产生原因: 通过重定向,Web 应用程序能够引导用户访问同一应用程序内 ...

  4. git 把其他分支上的文件拿来覆盖本地

    1:git checkout oldversion -- 文件地址 2: 一个分支从某个角度讲也像是一次commmit,也是有向无环图的一个点

  5. -bash: 无法为立即文档创建临时文件: 设备上没有空间---记一次报错

    故障发生原因 测试环境,之前用该机器做过docker-compose,后来有需要用到该机器上的docker环境,需要将旧的docker容器全部删除,由于之前启动是使用docker-compose启动的 ...

  6. 使用Windows命令行reg控制注册表键值

    使用Windows命令行reg控制注册表键值 引言 熟悉Windows操作系统的朋友可能都知道,Windows操作系统下的注册表相当于系统的数据库 ,部分软件将自己的配置信息都放在注册表里面,而注册表 ...

  7. zookeeper入门(1)---基本概念

    转载 : https://blog.csdn.net/java_66666/article/details/81015302 一. zookeeper概念 它是一个分布式服务框架,是Apache Ha ...

  8. 【基础搜索】poj-2676-Sudoku(数独)--求补全九宫格的一种合理方案

      数独 时限:2000 MS   内存限制:65536K 提交材料共计: 22682   接受: 10675   特别法官 描述 数独是一个非常简单的任务.一个9行9列的正方形表被分成9个较小的3x ...

  9. VUE编译报错 Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead

    背景: 在使用VUE添加标签的时候编译报错,报错如下: Component template should contain exactly one root element. If you are u ...

  10. Latex快速注释掉多行

    最简单的方法就是选中你想要注释掉的内容,同时按住Ctrl+Alt+Shift+→