本节主要总结迭代器的设计原则,以及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. SQL Server2008分离数据库

    1.右击数据库 2.Tasks 3.点击Detach 4.选取Drop Connections-->点击确定 5.开启本地数据库默认存储路径C:\Program Files\Microsoft ...

  2. sql 语句实现一串数字位数不足在左侧补0的技巧

    https://www.cnblogs.com/mylydg/p/5725189.html 在日常使用sql做查询插入操作时,我们通常会用到用sql查询一串编号,这串编号由数字组成.为了统一美观,我们 ...

  3. Datatable批量导入到表

    封装批量提交数据到表,用于数据同步作业 private string GetSelectFieldNames(DataTable dataTable, string tableName = " ...

  4. php 5.6.36 安装mcrypt

    相关扩展安装步骤 libmcrypt downloadUrl:https://sourceforge.net/projects/mcrypt/files/MCrypt/ versionCode:2.5 ...

  5. 在Windows上安装 Consul

    使用Chocolatey(Windows包管理工具)安装 官方安装说明 https://chocolatey.org/install 安装Consul 官方安装说明 https://chocolate ...

  6. Django学习笔记 (一) 开发环境配置

    Django是一个开放源代码的Web应用框架,由Python写成. 采用了MVC的软件设计模式,即模型M,视图V和控制器C. 1. Python安装 下载地址: http://www.python.o ...

  7. 图片预先加载 preloadjs

    <body><div class="loading"> <div class="progress"></div> ...

  8. phpstom激活

    phpstom官网:https://www.jetbrains.com/phpstorm/download 激活方法:激活时选择License server 填入http://idea.imsxm.c ...

  9. Typora数学公式

    LaTeX编辑数学公式基本语法元素 LaTeX中的数学模式有两种形式: inline 和 display. 前者是指在正文插入行间数学公式,后者独立排列,可以有或没有编号. 行间公式(inline) ...

  10. 【深度学习】Precision 和 Recall 评价指标理解

    1. 四种情况 Precision精确率, Recall召回率,是二分类问题常用的评价指标.混淆矩阵如下: 预测结果为阳性 Positive 预测结果为假阳性 Negative 预测结果是真实的 Tr ...