求STL容器的两个iterator的距离

什么是Iterator?
        iterator的概念源自于对遍历一个线性容器工具的抽象,即如何你能访问这个容器的某个元素。对于最简单的数组,当然可以用数组的索引值,因为数组是连续存放在内存中的;但对于链表,就必须用指针。除此之外,还有还有很多种数据结构需要提供一个方便的工具来访问其中的元素,方法有ID,关键字等等。为了统一所有的容器的这种工具的使用,一般提供一整套容器的开发者就会用一种方式来表示各种容器的访问工具。例如C++   STL就是使用iterator。MFC自己的容器使用position。C#和java也有自己的方法,但方法是不变的。   
        iterator的用法可以被统一,但不同的底层容器实现其iterator的原理是不一样的。例如iterator++你可以理解为移动到容器的下一个元素,如果底层如果是数组,把索引值加一就行;如果底层是链表,就得执行类似于m_pCurrent   =   m_pCurrent->pNext;的操作。因此每种容器都有自己的iterator实现方法。

Iterator的类型
1、Input Interator :只允许作为输入,也就是只读(Read Only)
2、Output Interator :只允许作为输出,也就是只写(Write Only)
3、Forward Interator :允许读写,但只能做前向移动
4、Bidirectional Interator :允许读写,可以做双向移动
5、Random Access Interator :允许读写,可以任意移动


实现Distance()
        由上可知,从容器特性来划分是具有两种iterator的,一种是线性容器的iterator(数组,vector等);一种是非线性容器的iterator(链表等),因此求两个容器的距离自然也是有两种方法的。

非线性容器:
None.gifint distance(InputIterator p1, InputIterator p2)
ExpandedBlockStart.gif {
InBlock.gif  size_t n = 0;
InBlock.gif  while ( p1 != p2 )
ExpandedSubBlockStart.gif  {
InBlock.gif     ++p1;
InBlock.gif     ++n;   
ExpandedSubBlockEnd.gif  }
InBlock.gif  return n;
ExpandedBlockEnd.gif
None.gif


线性容器:
None.gif int distance(RandomAccessIterator p1, RandomAccessIterator p2)
ExpandedBlockStart.gif {
InBlock.gif return p2-p1;
ExpandedBlockEnd.gif
None.gif


std::distance()实现了以上两种Iterator的算法,并根据传入的Iterator类型进行适配。 
具体可以参考侯捷翻译的《STL源码剖析》一书,当中有详细的讲解。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值