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]