不二如是 发表于 2016-10-26 11:05:55

117-容器的遍历-迭代器(iterators)-【扫盲】

本帖最后由 不二如是 于 2016-10-26 14:56 编辑

遍历容器可以通过使用迭代器(iterator)来完成,迭代器提供了一个统一的方法来访问项目。

Qt里面提供了两种类型的迭代器:

Java风格、STL风格

Java迭代器在使用时比STL方便一些,但性能稍微差些。

不过基本上95%二者,只是用不同形式,实现相同的事情而已~

不二这次只介绍STL迭代器,Java玩儿的少,没有发言权。。。



点我带你看一篇介绍Java迭代器的文章哈

哪位鱼油大神可以,可以自告奋勇补上哈,不二必有重谢啦{:10_336:}

好,看下一页,我要开始扯STL了




STL风格迭代器兼容Qt和STL的通用算法(generic algorithms),并且在速度上进行了优化~




我给翻一下哈,憋着急~

对于每一个容器类,都有两个STL风格迭代器类型:


[*]提供了只读访问

[*]提供了读/写访问



容器 只读迭器 读/写迭代器
QList<T>
QQueue<T> QList<T>::const_iteratorQList<T>::iterator
QLinkedList<T> QLinkerList<T>::const_iteratorQLinkerList<T>::iterator
QVector<T>
QStack<T> QVector<T>::const_iterator QVector<T>::iterator
QSet<T> QSet<T>::const_iterator QSet<T>::iterator
QMap<Key,T>
QMultiMap<Key,T> QMap<Key,T>::const_interator QMap<Key,T>::iterator
QHash<Key,T>
QMultiHash<Key,T> QHash<Key,T>::const_iteratorQHash<Key,T>::iterator


STL风格迭代器的API(Application Programming Interface)模仿了数组的指针。

例如:

使用‘++’操作符来表示向后移动

使用‘*’操作符表示返回迭代器指向的的项目。

STL风格迭代器是直接指向项目的!

一个容器的begin()函数返回了一个指向该容器中第一个项目的迭代器

end()函数也返回一个迭代器,但是!

这个迭代器指向该容器的最后一个项目的下一个假想的虚项目!


再来重复加深下印象:

这个迭代器指向该容器的最后一个项目的下一个假想的虚项目!

这个迭代器指向该容器的最后一个项目的下一个假想的虚项目!

end()标志着一个无效的位置,当列表为空时,begin()函数等价于end()函数。


在STL风格迭代器中 ‘++’和‘--’

可以作为前缀(++i,--i)操作符,也可作为后缀(i++,i--)操作符!

当作为前缀时会修改迭代器,然后返回修改后的迭代器的一个引用。

当作为后缀时,在修改迭代器前,会对其进行复制,然后返回这个复制。

如果在表达式中不会对返回值进行处理,那么最好使用前缀操作符(++i,--i),这样会更快一些!

对于非const迭代器类型,使用‘*’获得返回值可以用在赋值运算符的左侧。

API翻译如下:


表达式 动作
*i 返回当前项目
++i 使迭代器到下一个项目
i += n 使迭代器前移n个项目
--i 使迭代器到前一个项目
i -= n 使迭代器后退n个项目
i - j 返回迭代器i和迭代器j之间的项目的数目









页: [1]
查看完整版本: 117-容器的遍历-迭代器(iterators)-【扫盲】