【STL标准库 & 范型编程】学习笔记(6):迭代器的设计原则和Iterator Traits的作用与设计

66 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14 天,点击查看活动详情

traits 前言

traits:特征、特性,人为制造的萃取机、萃取剂,目的是用于输入一些东西,帮助我们萃取出我们需要的特征。标准库中有多种traits,这里谈论迭代器的traits(Iterator Traits)

在这里插入图片描述

Iterator Traits 引入

既然我们需要对iterator进行萃取,那么就需要知道Iterator 应该遵循的原则

从下图可以看出:iterator服务于算法,是算法运行的支撑,也就是我们需要针对算法的提问进行回答(给算法需要的一些特性)

在这里插入图片描述

以rotate算法为例:

在这里插入图片描述

其中需要知道iterator三个associated types

  • iterator_category():用于知道iterator的tag,也就是迭代器移动的规则,是可以前进,还是后退,还是两种都可以...
  • difference_type:两个iterator之间的距离的表示类型
  • value_type:iteartor所指元素的类型

在这里插入图片描述

iterator必须提供的五种associated types

可以定义出以下iterator

在这里插入图片描述

那么在算法中就可以这样用

在这里插入图片描述

但是存在一个问题:如果iterator并不是一个class呢?比如native pointer(c++原生的指针)。

这时也就是需要我们进行选择,当iterator类型不同时,选择不同的iterator实现(这个感觉用实现有点不对...)

也就引入的萃取:traits的概念

在这里插入图片描述

Iterator Traits举例

通过迭代器I的不同,适用iterator_traits进行萃取,得到其不同的特性,如下例子

在这里插入图片描述

使用前迭代器之前,先使用萃取器traits进行萃取(起到一个询问的作用)

在这里插入图片描述

Note:value_type的主要目的是用来声明变量,而声明一个无法被赋值的变量没什么用,所以iterator(即便是constant iterator)的value type 不应加上const。iterator若是const int* ,其value_type应该是int而不是const

在这里插入图片描述

标准库中iterator_traits完整写法:

在这里插入图片描述

备注:

  • 还需要再加强理解,半懂不懂
  • 同时还需要了解半特化....(有点不太懂)