Qt迭代器(Java类型和STL类型)介绍

2023-11-04

一、介绍

遍历一个容器可以使用迭代器(iterators)来完成,迭代器提供了一个统一的方法来访问容器中的元素。而Qt的容器类提供了两种类型的迭代器:Java风格迭代器和STL风格迭代器

二、Java 类型迭代器

对于每个容器类,有两个 Java 类型迭代器:一个用于只读操作,一个用于读写操作,各个Java 类型的容器类见表 1。
 

表 1 Java类型的迭代器类
容器类 只读迭代器 读写迭代器
QList<T>, QQueue<T>  QListItcrator<T> QMutableListItcrator<T>
QLinkedList<T> QLinkedListIterator<T> QMutableLinkedListIterator<T>
QVector<T>, QStack<T> QVectorllcrator<T> QMutableVectorIterator<T>
QSet<T> QSetItcrator<T> QMutableSetItcrator<T>
QMap<Key, T>, QMultiMap<Key, T> QMapIterator<Key, T> QMutableMapIterator<Key, T>
QHash<Key, T>, QMultiHash<Key, T> QHashIterator<Key, T> QMutablcHashlterator<Key, T

使用,正向遍历

QList<QString> list;
list << "A" << "B" << "C" << "D";

QListIterator<QString> i (list);
while (i.hasNext()) {
    qDebug () << i.next ();
}

反向遍历

    QList<QString> list;
    list << "A" << "B" << "C" << "D";    
    QListIterator<QString> secondIter(list);
    secondIter.toBack(); // 迭代器移动到列表的最后面(最后一个数据项之后)
    while (secondIter.hasPrevious()){ // 如果迭代器不是位于列表的最前面,返回true
           qDebug() << secondIter.previous(); // 返回前一个数据项,并且迭代器前移一个位置
    }

QList移除

QListIterator没有提供从list中插入或移除项的函数,想要实现插入和移除,你必须使用QMutableListIterator。下面举例说明使用QMutableListIterator从QList<int>中移除所有奇数。

    QList<int> list{ 1, 129, 250, 300, 25 };
    QMutableListIterator<int> i(list);

    while (i.hasNext()) {
        if (i.next() % 2 != 0) {
            i.remove();
        }
    }


    QListIterator<int> second(list);
    while (second.hasNext()) {
        qDebug() << second.next();
    }

 

 

QList修改

如果想修改某项的值,我们可以使用setValue(),下面的代码中,我们用128来替换所以大于128的值:

QList<int> list({1, 129, 250, 300, 25}); 
QMutableListIterator<int> i(list);

while (i.hasNext()) {
    if (i.next() > 128) {
        i.setValue(128);
    }
}

三、 STL类型迭代器

STL 迭代器与 Qt 和 STL 的原生算法兼容,并且进行了速度优化。具体类型见表 4。

容器类 只读迭代器 读写迭代器
QList<T>, QQueue<T> QList<T>::const iterator QList<T>::iterator
QLinkedList<T> Q1. i nked List<1>: :const_iterator QLinkedList<T>::iterator
QVector<T>, QStack<T> QVector<T>::const_ilerator QVector<T>::iterator
QSet<T> QSet<T>::const_iterator QSet<T>::iterator
QMap<Key, P> QMultiMap<Kcy, T> QMap<Key, T>::const_iterator QMap<Key, T>:: iterator
QHash<Key, T> QMultiHash<Key, T> QHash<Key, T>: :const_iterator QHash<Key, T>::iterator

 对于每一个容器类,都有两个 STL 类型迭代器:一个用于只读访问,一个用于读写访问。无需修改数据时一定使用只读迭代器,因为它们速度更快。

正向遍历

QList<QString> list;
list << "A" << "B" << "C" << "D";
QList<QString>::const_iterator i;
for (i = list.constBegin(); i != list.constEnd(); ++i){
     qDebug() << *i;
}

反向遍历

QList<QString>::reverse_iterator i;
for (i = list.rbegin(); i != list.rend(); ++i){
    *i = i->toLower();
}

四、关联容器类的迭代器的用法

对于关联容器类 QMap 和 QHash,迭代器的操作符返回数据项的值。如果想返回键,使用 key() 函数。对应的,用 value() 函数返回一个项的值。

例如,下面的代码将 QMap<QString,int> map 中所有项的键和值输出:

QMap<QString, int> map;
map.insert("Paris",1993);
map.insert("New York",1995);
map.insert("Mexico City",1996);

QMap<QString, int>::const_iterator i;
for (i = map.constBegin(); i != map.constEnd(); ++i)
qDebug () << i.key () << ':' << i.value ();


参考:

Qt迭代器(Java类型和STL类型)详解

 Qt容器类之二:迭代器 - 走看看

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt迭代器(Java类型和STL类型)介绍 的相关文章

  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 逃离的正确方法是什么?使用 Oracle 12c MATCH_RECOGNIZE 时 JDBCPreparedStatement 中的字符?

    以下查询在 Oracle 12c 中是正确的 SELECT FROM dual MATCH RECOGNIZE MEASURES a dummy AS dummy PATTERN a DEFINE a AS 1 1 但它不能通过 JDBC
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 使用 CSharpCodeProvider 类编译 C# 7.3 的 C# 编译器版本是什么?

    我想使用 Microsoft CSharp CSharpCodeProvider 类来编译 C 7 3 代码 编译器版本在 IDictionary 中指定 在创建新的 CSharpCodeProvider 时将其作为输入 例如 Compil
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • Atlassian Confluence 远程代码执行漏洞(CVE-2022-26134)漏洞复现

    目录 免责声明 Atlassian Confluence 远程代码执行漏洞 CVE 2022 26134 漏洞复现 漏洞概述 影响版本 漏洞复现 利用POC 利用过程 修复建议 参考 免责声明 本文章仅供学习和研究使用 严禁使用该文章内容对
  • Python实现图像质量评价准则PSNR

    本文引用自 Python代码之计算PSNR pytorch计算psnr qtSunnylove的博客 CSDN博客 计算PSNR的Python代码 网上有下面两种 import cv2 import numpy as np import m
  • windows安装nodejs【详细教程】

    安装nodejs 去官网下载https nodejs org zh cn download 双击安装msi 选择下一步 选择我同意 下一步 选择安装路径 点击下一步 点击下一步 点击下一步 点击安装 点击完成 查看版本号win r输入cmd
  • 线上知识竞答小程序

    前几天恰逢五四青年节 帮我们党支部开发了一套知识竞赛类答题小程序 文章末尾有小程序码可以体验 该小程序目前已完成 用户授权 授权后答题 答题完成展示排名 完整支持知识竞赛答题活动的需求 答题目前已支持单选 多选 判断三种题型 不详细介绍了
  • CATIA Automation对象架构-Application对象详解(一)Document/SettingControllers

    CATIA Automation对象架构 下面是CATIA Automation的对象架构 可以看出 Application是顶层对象 Application对象 从对象架构中 可以看到Application对象下的子对象主要如下 1 Do
  • 51单片机 数码管的静态显示和动态显示

    51单片机 数码管的静态显示和动态显示 数码管 Segment Displays 由多个发光二极管封装在一起组成 8 字型的器件 引线已在内部连接完成 只需引出它们的各个笔划 公共电极 数码管实际上是由七个发光管组成8字形构成的 加上小数点
  • ts如何使用终端直接输出console(基础教程)

    安装 typescript npm install g typescript 安装 ts node npm install g ts node 新建一个ts文件 比如 demo ts function add n1 number n2 nu
  • 前端安全总结

    你的服务器安全么 1 概述 在本人所处的公司的服务器正式遭到黑客攻击之前 一直都以为 黑客 是个遥不可及的词 直到真正成为了受害者时 才猛然意识到安全的重要性 有一些基本经验和心得总结出来 和同行分享一下吧 2 暴破手段 最粗暴的黑客行为
  • AB test 之 广告投放(二)

    在广告投放的A B测试中 有几个重要的注意要点需要考虑 目标和假设 明确测试的目标 并基于此制定假设 确定您希望测试的指标 例如点击率 转化率 收入等 并提出假设 即测试组和对照组之间是否存在显著差异 随机分组 确保测试组和对照组的分配是随
  • 【强烈推荐】 十多款2023年必备国内外王炸级AI工具 (免费 精品 好用) 让你秒变神一样的装逼佬感受10倍生产力 (5) AI编程自动写代码

    个人主页 极客小俊 作者简介 web开发者 设计师 技术分享博主 希望大家多多支持一下 我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 AI 编程自动代码生成 AI现在真的是无敌 连代码都可以生成 我的天 看来程序员失业
  • Conflux Hydra网络Hardfork升级已完成(2022.02.28)

    Conflux Hydra 网络 Hardfork 升级已经完成 目前网络状态稳定 最新网络版本号 v2 0 0 fix END 了解最新动态
  • Java单例模式(解决反射攻击,反序列化攻击)

    单例模式 什么是单例模式 单例模式就是确保类的实例对象只能有一个 类本身要实例化好这个对象提供给其他所有的类访问 单例模式就是为了避免状态不一致 单例模式特定 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象
  • 雷军的发布会,真狠呀!

    在雷军演讲前 人物 用今年的热搜话题向雷军进行了提问 问题1 年年演讲灌鸡汤 算是卖成功学吗 雷军 成功学 说实话我真的不太懂 我每年办演讲 主要想跟大家分享一些我成长的经历 问题2 把失败经历当笑话讲 这心态要怎么练 雷军 刚开始的时候我
  • 比较运算符、逻辑运算符

    不管是比较运算符还是逻辑运算符 重点都是运算 是运算的话都会得到一个结果值 先说比较运算符 大概就是上面这些运算符 看运算符怎么运算的 直接判断这个比较逻辑上是不是正确的 就比如4 3 很明显是正确的 结果是正确的 值是用布尔值表示的也就是
  • 创建带图文的超级菜单(导航菜单)(二)

    Avada带有一个超级菜单功能 基本是在WP原有的基础上扩充的 功能还是挺好用 下面说下如何创建比较漂亮的超级菜单 此文内容主要在于理解超级菜单和其他项目的逻辑关系 搞清楚它的逻辑你就好操作了 本文目录 1 整体思路 2 其他须知 3 创建
  • 关于微信小程序开发中input、textarea等表单组件在键盘弹起时,页面显示内容被挤出顶部导航栏,解决方案的建议

    关于微信小程序开发中input textarea等表单组件在键盘弹起时 页面显示内容被挤出顶部导航栏 解决方案的建议 代码附图 希望采纳 键盘弹起时 解决键盘遮挡问题 开启键盘时 function keyboardOcclusion e i
  • java 调用C#语言写的dll文件代码 超详细过程

    前言 最近在编写项目时候 遇到了java调用C 类库的情况 试了很多种方法 也遇到了很多坑 解决之后写下来 作为记录和分享给有用的朋友们 在这里我用的工具是jni4net 0 8 8 0 Visual Studio2015 一 编写C 类库
  • [人工智能AI]之贝叶斯网络

    人工智能AI 之贝叶斯网络 Bayesian network 部分图片和来源自 NJU 人工智能 高阳教授 的课件 通俗地讲 贝叶斯网络就是用一组有向无环图 表示多个事件的因果依赖关系 并借此完成相关推理计算 1 贝叶斯定理 条件概率 这里
  • linux服务器上部署多个vue项目(使用相同的ip(域名)及端口号)

    linux服务器上部署多个vue vue2 0 项目 使用相同的ip 域名 及端口号 1 首先想要实现的效果为 http ip 端口号 a 注 a代表a项目 http ip 端口号 b 注 b代表b项目 2 linux的文件路径为 3 此时
  • Qt迭代器(Java类型和STL类型)介绍

    一 介绍 遍历一个容器可以使用迭代器 iterators 来完成 迭代器提供了一个统一的方法来访问容器中的元素 而Qt的容器类提供了两种类型的迭代器 Java风格迭代器和STL风格迭代器 二 Java 类型迭代器 对于每个容器类 有两个 J