C++STL源码分析(三):迭代器和iterator Teaits

1.Iterator需要遵循的原则

iterators 是算法和容器的桥梁,迭代器将容器中的一段范围告诉算法

Iterator由于算法的执行需要,要具备5个associated type:

  1. iterator_traits<_Iter>::iteraptor_category:迭代器的类型 ,有的只能++ 、有的能-- 、有的能跳跃前进
  2. value_type 指向元素的类型
  3. difference_type:两个iterator间的距离用什么 type来表示
  4. reference: 未被使用
  5. pointer: 未被使用

迭代器本身必须定义出来上述5种类型,以便回答算法提问

相关源码截图:

疑问:如果使用的iterator不是一个class,而是native pointer呢? 原生的指针也是一种退化的迭代器,可是它没有定义上面的5个associate type呀?

2.Iterator Traits

为了解决上面的疑惑,必须有一个工具来区分算法收到的iterator是class表现得iterator还是非class形式得iterator

这个机器就是Ierator Traits(一个中间层)

解决计算机问题得尚方宝剑:加一个中间层!!

  • 如果是class iterator的话value_type直接通过iterator_traits间接获得就行了
  • 如果是pointer to T则利用偏特化处理
  • 如果是Pointer to const T则利用偏特化处理

各种各样得Traits

  • type traits
  • iterator traits
  • char traits
  • allocator traits
  • pointer traits
  • array traits

3.iterator的分类

STL中的算法是看不到容器的,并且对containers一无所知。算法所需要的一切信息都必须由iterators取得,而Iterators(由containers提供)必须能够回答Algorithm的所有提问,才能搭配该Algorithm的所有操作

五种iterator category

  1. struct input_interator_tag{};
  2. struct output_interator_tag{};
  3. struct forward_iterator_tag : public input_iterator_tag{};
  4. struct bidirectional_iterator_tag : public forward_iterator_tag{};
  5. struct random_aceess_iterator_tag : public bidirectional_iterator {};

通过typeinfo来查看

 

 

 

 

 

 

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值