首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于Iterator解决方法

2012-09-19 
关于Iteratorc++ Iterator 是什么东西,是怎么实现的,本质是什么?[解决办法]百度一下迭代器模式[解决办法]

关于Iterator
c++ Iterator 是什么东西,是怎么实现的,本质是什么?

[解决办法]
百度一下
迭代器模式
[解决办法]
可能是指针 可能是类 看迭代器类型 记得书上是这么说的
[解决办法]
类似指针的东西
[解决办法]
是迭代子,
它一般重载Iterator & operator ++(INT)用来迭代,
重载*()用来取值,可以是左值和右值。
平时,你一定用指针作为迭代子,只不过现在变成了类而已。
1。因为对象是迭代子,所以它里面可以记录更多的迭代状态,而一个指针的只有
一个状态。
2。它可以屏蔽容器之间的差异,有了迭代子,你不用管他是链表还是Iostream,还是数组。

当然,容器是分类型的,对应双向迭代子,随机迭代子等等。
Iterator 一般作为容器类的嵌套类来实现。即Container::Iterator
[解决办法]
我也粘贴一个,其实第一段话才是最主要的。只要有这个功能的东西,可以叫iterator,一个数组:char arr[19]; char*ptr; 那么ptr就是这个数组的iterator,只是更复杂的容器要有他独特的方式来遍历,所以要自定义一个iterator类在它里面。

迭代器(Iterators)是STL的核心,它们是泛型指针,是一种指向其他对象(objects)的对象,迭代器能够遍历由对象所形成的区间(range)。迭代器让我们得以将容器(containers)与作用其上的算法(algorithms)分离,大多数的算法自身并不直接操作于容器上,而是操作于迭代器所形成的区间中。

  迭代器一般分为五种:Input Iterator、Output Iterator、Forward Iterator、Bidirections Iterator和Random Access Iterator。Input Iterator就象只从输入区间中读取数据一样,具有只读性,属于单向移动,如STL中的istream_iterator。

  Output Iterator刚好相反,只写出数据到输出区间中,具有只写性,属于单向移动,如STL中的ostream_iterator。Forward Iterator也属于单向移动,但不同之处是它同时具有数据读、写性。Bidirections Iterator如名称暗示,支持双向移动,不但可以累加(++)取得下一个元素,而且可以递减(--)取前一个元素,支持读、写性。Random Access Iterator功能最强,除了以上各迭代器的功能外,还支持随机元素访问(p+=n),下标(p[n])、相减(p1-p2)及前后次序关系(p1<p2)等。

  Input Iterator和Output Iterator属于同等最弱的二种迭代器,Forward Iterator是前二者功能的强化(refinement),Bidirections Iterator又是Forward Iterator迭代器的强化,最后Random Access Iterator又是Bidirections Iterator迭代器的强化。如下简单示例展示Input Iterator、Forward Iterator、Bidirections Iterator和Radom Access Iterator迭代器的功能(其中input_iterator_tag等带tag字符串为各不同迭代器的专属标识):

C/C++ code
  1、InputIteratortemplate<class InputIterator, class Distance>void advance(InputIterator& i, Distance n, input_iterator_tag){for(; n>0; --n,++i){} // InputIterator具有++性}  2、ForwardIteratortemplate<class ForwardIterator, class Distance>void advance(ForwardIterator& i, Distance n,forward_iterator_tag){advance(i, n, input_iterator_tag());}  3、BidirectionalIteratortemplate<class BidirectionalIterator, class Distance>void advance(BidirectionalIterator& i, Distance n, bidirectional_iterator_tag){if(n>=0) // 具有++、--性for(; n>0; --n,++i){}elsefor(; n>0; ++n,--i){}}  4、RandomAccessIteratortemplate<class RandomAccessIterator, class Distance>void advance(RandomAccessIterator& i, Distance n, random_access_iterator_tag){i += n; // 具有++、--、+=等性} 

热点排行