Java类型迭代器

Java类型迭代器不是指向数据项,而是在数据项之间,如图:

注意:

Java类型的迭代器是指向数据项之间的,每次使用next()函数时,迭代器是先跳到下一对数据项之间,再返回跳过的数据项的值,供于下面的操作的。如图:

顺序容器:

//JAVA类型迭代器

//只读

QListIterator<QString> i(s);

//for循环

for (; i.hasNext();)

{

qDebug() << i.next();

}

i.toFront();

//while

while (i.hasNext())

{

qDebug() << i.next();

}

//读写

QMutableListIterator<QString> o(s);

o.toFront();

for (; o.hasNext();)

{

o.next();     //这里的o.next要和setvalue交换位置,因为,JAVA迭代器是从前面开始的,就是先next跳过这一项并返回跳过的这一项的值,用以下面的操作

o.setValue("帅");

}

o.toFront();

while (o.hasNext())

{

qDebug() << o.next();

}

关联容器:

//JAVA迭代器

//只读

QMapIterator<int, QString> k(map);

for (; k.hasNext();)

{

k.next();

qDebug() << k.key() << k.value();

}

STL类型迭代器

STL类型的迭代器是数组指针,并且是直接指向数据项的与Java的不同,所以“++”运算符可以使迭代器指向下一个数据项,“*”运算符可以返回数据项的内容。

注意:在定义只读迭代器和读写迭代器时,他们使用的是不同的关键字,此外还可以使用const_reverse_iterator和reverse_iterator定义相应的反向迭代器。

常用函数:

函数    作用

begin()     [用于读写迭代器]使迭代器指向容器的第一个数据项

end()  [用于读写迭代器]使迭代器指向一个虚拟的表示结尾的数据项

constBegin()   [用于只读迭代器]表示起始位置

constEnd()      [用于只读迭代器]表示结束位置

rbegin()    [用于反向读写/只读迭代器]表示起始位置

rend()       [用于反向读写/只读迭代器]表示结束位置

顺序容器:

//STL类型迭代器

//只读

QList<QString>::const_iterator m;

for (m = s.constBegin(); m != s.constEnd(); m++)

{

qDebug() << *m;

}

//读写

QList<QString>::iterator n;

for (n = s.begin(); n != s.end(); n++)

{

*n = "牛";

qDebug() << *n;

}

关联容器:

//STL迭代器

//只读

QMap<QString, int>::const_iterator cmp;

for (cmp = city_zone.constBegin(); cmp != city_zone.constEnd(); cmp++)

{

qDebug() << cmp.key() << cmp.value();

}

区别

两者比较,Java 类型的迭代器更易于使用,且提供一些高级功能,而 STL 类型的迭代器效率更高。

java风格迭代器是指向项目之间的,而不是直接指向项目。所以迭代器要么指向容器的最前面,或者指向两个项目之间,或者指向容器的最后面。

java风格迭代器方便很多,但性能稍微弱于STL。

STL迭代器兼容Qt 和 STL的通用算法,而且在速度上进行了优化。

STL风格迭代器API模仿了数组的指针,例如用 “ ++ ” 来后移迭代器使其指向下一个项目,使用 “ * ”操作符返回迭代器指向的项目等。 不同与java风格,STL风格迭代器是直接指向项目的。

这两种风格的迭代器都有提供 “只读” 和 ”读写“ 两种类型。

在STL风格迭代器中 “++” 和 “–” 操作符可以作为前缀也可以作为后缀,当作为前缀时会先修改迭代器,然后返回修改后的迭代器的一个引用。作为后缀时,在修改迭代器前会对其进行复制,然后返回这个复制。

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

QTL 详解二------迭代器相关推荐

  1. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  2. [转]文件IO详解(二)---文件描述符(fd)和inode号的关系

    原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...

  3. PopUpWindow使用详解(二)——进阶及答疑

    相关文章: 1.<PopUpWindow使用详解(一)--基本使用> 2.<PopUpWindow使用详解(二)--进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...

  4. Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  5. linux 进程间通信 dbus-glib【实例】详解二(下) 消息和消息总线(ListActivatableNames和服务器的自动启动)(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  6. linux 进程间通信 dbus-glib【实例】详解二(上) 消息和消息总线(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  7. Android Gradle 自定义Task详解二:进阶

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78523958 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  8. Android Loader 异步加载详解二:探寻Loader内部机制

    Android Loader 异步加载详解二:探寻Loader内部机制 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/7025991 ...

  9. EXT核心API详解(二)-Array/Date/Function/Number/String

    EXT核心API详解(二)-Array/Date/Function/Number/String Array类 indexOf( Object o )  Number object是否在数组中,找不到返 ...

最新文章

  1. YourEclipse—不只是Eclipse开发者社区
  2. Unity shader学习之屏幕后期处理效果之高斯模糊
  3. MySQL【问题记录 01】报错 1709 - Index column size too large. The maximum column size is 767 bytes. 可能是最简单的方法
  4. 通过python 爬取网址url 自动提交百度
  5. mahout学习笔记4
  6. python建立列表并输入_python操作列表
  7. android html转pdf工具,android – 使用iText库将html转换为pdf时未应用hr的内联CSS
  8. SQL Server 数据库中的 MD5 和 SHA1
  9. 互联网上,极致才能成功
  10. Linux系统配置jdk环境变量
  11. 计算机硬件配置及安装,电脑硬件及电脑配置知识大全
  12. 2018产品经理都在入驻的平台——汇新云
  13. 汽车CAN通信基础知识-CAN数据结构
  14. # TIG监控体系搭建
  15. [bzoj1226]学校食堂Dining
  16. 软件项目投标标书规范格式
  17. 【LeetCode】40. 组合总和 II (JavaScript)
  18. 【python】pygame实现植物大战僵尸小游戏(附源码 有注释)
  19. WebRtc以Trickle ICE形式去进行pair
  20. 不愧是阿里P8!深入理解Java虚拟机pdf百度云

热门文章

  1. 人体传感器好不好用?怎么用?Aqara绿米、小米之间到底买哪个
  2. 【数据库-MySql】[Err] 1062 - Duplicate entry '1-1' for key 'PRIMARY'
  3. Adobe国际认证 Illustrator CC 考试学习指南
  4. mysql+存key+value_Friendfeed的MySQL key/value存储
  5. Sinfor AC 配置详解
  6. hdoj_4417Super Mario
  7. 职称考试计算机怎么学容易,职称计算机考试过关必读的9大技巧
  8. c++ 给枚举类型设置基础类型
  9. AJAX调试技术 IE篇
  10. 赶集网招聘信息数据分析与可视化辑器