stl源码剖析笔记之iterator

这篇博客详细介绍了STL中iterator的分类,包括input、output、forward、bidirectional和random-access iterator。文章还讨论了iterator_category如何区分不同类型的iterator,以及全局函数iterator_category()、value_type()、distance_type()的作用和历史背景。此外,重点讲解了迭代器适配器,如insert iterator、reverse iterator的工作原理,通过示例和源码分析揭示了它们的功能和设计思路。
摘要由CSDN通过智能技术生成

此系列是本人阅读《STL源码剖析》的一点心得体会,并结合部分STL源码加深理解。此篇博客为第三章iterator的读书笔记。

综述

    有个地方容易混淆,首先,有五种iiterator

  • input iterator
  • output iterator
  • forward iterator,
  • bidirectional iterator,
  • random-access iterator

     但是又有

  • insert iterator
  • stream iterator
  • reverse iterator
  • move iterator

        那么到底是怎么分类的?
        《C++标准库》有一句话说的很好,“iterator是一个抽象概念,任何东西,只要其行为像iterator,它就是iterator”。而不同的容器可能需要不同行进能力的iterator。input iterator, output iterator, forward iterator, bidirectional iterator, random-access iterator就是以行进能力来区分iterator,称之为iterator category。
    而insert iterator, stream iterator, reverse iterator, move iterator属于迭代器适配器(iterator adpater),是C++库提供的预定义的特殊迭代器,可以说是对迭代器功能性的补足吧。

iterator_category

    iterator模板有五个型别(type)

    template <class _Category, class _Tp, class _Distance = ptrdiff_t,
              class _Pointer = _Tp*, class _Reference = _Tp&>
    struct iterator {
      typedef _Category  iterator_category;
      typedef _Tp        value_type;
      typedef _Distance  difference_type;
      typedef _Pointer   pointer;
      typedef _Reference reference;
};

    区分不同category的iterator主要依靠其型别(type) iterator_category,不同的iterator将不同的struct定义为其iterator_category,以利用模板参数推导,使得类模板或函数模板针对不同iterator做出不同行为。

struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag : public input_iterator_tag {};
struct bidirectional_iterator_tag : public forward_iterator_tag {};
struct random_access_iterator_tag : public bidirectional_iterator_tag {};

    可以看到,除了output iterator外,不同的struct是依次继承的关系。那么这样设计有什么好处呢?可以利用继承机制来简化代码。
    书中99页的例子对此做出了解释。distance()函数可以计算两个迭代器之间的距离,对于input iterator, forward iterator, bidirectional iterator, 只能一次次移动迭代器进行计算,而对于ra

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值