开启掘金成长之旅!这是我参与「掘金日新计划 · 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完整写法:
备注:
- 还需要再加强理解,半懂不懂
- 同时还需要了解半特化....(有点不太懂)