QT学习积累——如何提高Qt遍历list的效率

在这里插入图片描述

目录

  • 引出
    • Qt遍历list提高效率
    • 显示函数的调用
    • 使用`&`与不使用`&`
    • 除法的一个坑
  • 总结
    • 自定义信号和槽
      • 1.自定义信号
      • 2.自定义槽
      • 3.建立连接
      • 4.进行触发
    • 自定义信号重载
      • 带参数的
      • 按钮触发
      • 信号触发信号
      • 拓展
    • lambda表达式
      • 返回值
      • mutable修饰
      • 案例

引出

QT学习积累——如何提高Qt遍历list的效率


Qt遍历list提高效率

在Qt中遍历QList或其他容器时提高运算效率主要依赖于以下几点:

  1. 使用迭代器而非索引访问:对于QList和其他Qt容器类,使用迭代器进行遍历通常比使用索引访问元素更高效,特别是在非随机访问容器(如QList对于大型对象)中。这是因为迭代器直接引用容器中的元素,而不是通过索引重新计算位置。
QList<int>::iterator it;
for (it = list.begin(); it != list.end(); ++it) {// 使用 *it 访问元素
}

或者使用C++11的范围基于的for循环:

for (int &element : list) {// 使用 element
}

避免不必要的对象复制:如果你的QList包含的是自定义类型或大型对象,请确保在遍历时使用引用(或常量引用,如果你不需要修改它们),这样可以避免遍历过程中对象的不必要拷贝。

for (CustomType &item : list) {// 使用 item
}

如果不需要修改元素,使用常量引用:

for (const CustomType &item : list) {// 只读访问 item
}

考虑使用更合适的容器QList是一个非常通用的容器,但并不总是最高效的选择。如果你需要频繁地在序列中间插入或删除元素,可能会更倾向于使用QLinkedList。如果元素经常被访问(特别是随机访问),则QVector可能是更好的选择。选择最适合你需求的容器类型可以显著提高性能。

减少遍历次数:有时可以通过算法优化来减少对容器的遍历次数。例如,如果可能,尝试将多个操作合并到单个遍历中完成,而不是对同一个列表进行多次遍历。

使用Qt Concurrent进行并行处理:对于大型数据集和可以并行处理的任务,考虑使用Qt Concurrent模块中的函数,如QtConcurrent::map,它可以自动地将任务分配到多个线程中执行,从而利用多核处理器的优势。

#include <QtConcurrent>void processItem(int &item) {// 对 item 进行处理
}QList<int> list = ...;
QtConcurrent::map(list, processItem);

遵循这些指导原则可以帮助你在Qt应用程序中提高遍历QList(以及其他容器)的运算效率。然而,请记住,性能优化应该是基于实际需要和通过分析确定的瓶颈来进行的。在许多情况下,代码的清晰性和可维护性比微小的性能提升更为重要。

显示函数的调用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用&与不使用&

在C++中,使用&与不使用&在for循环中会产生不同的行为:

  1. 使用 &: 当在范围for循环(range-based for loop)中使用引用符号&时,你将获得对容器内元素的直接引用。这意味着在循环内部对这些元素进行的任何修改都会反映到原始容器中的元素上。例如:
for (CircleData &ct : cList) {ct.someProperty = newValue; // 这将修改cList中元素的属性
}

在这个例子中,任何对ct的修改都会直接修改cList中的对应CircleData对象。

不使用 &: 如果不使用引用符号,范围for循环将创建容器内每个元素的副本。在这种情况下,循环内部对副本所做的任何修改都不会影响原始容器中的元素。例如:

for (CircleData ct : cList) {ct.someProperty = newValue; // 这只会修改副本的属性,并不会影响cList中的元素
}

在这个例子中,ctCircleData对象的一个临时副本,对它的修改不会影响cList中的原始对象。

总之,如果你打算修改循环中的元素,应当使用引用(&),这将避免不必要的对象副本并确保修改作用于容器中的实际元素。如果你不需要修改元素或者只是想读取元素的数据,那么可以省略&来避免潜在的副作用。然而,即使在只读情况下,为了避免不必要的拷贝操作,通常也会使用常量引用(const &),如下:

for (const CircleData &ct : cList) {// 只读取ct的数据,不进行修改
}

这样可以提高效率,特别是在处理大型对象时。

除法的一个坑

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在C++(包括Qt)中,如果你执行整数除法(例如 1 / 2),结果将是一个整数,因为操作数都是整数。这意味着结果会被截断,而不是四舍五入。因此,1 / 2 的结果将是 0,而不是 0.5

如果你想得到 0.5 这个结果,你需要确保至少有一个操作数是浮点数。这可以通过将其中一个操作数显式转换为浮点数来实现,或者直接使用浮点数进行运算。

以下是在Qt中如何将 1 / 2 的结果用浮点数接收的示例:

#include <QDebug>int main() {// 方法1: 将其中一个操作数转换为浮点数float result1 = static_cast<float>(1) / 2;qDebug() << "Result 1:" << result1;  // 输出: Result 1: 0.5// 方法2: 直接使用浮点数进行运算float result2 = 1.0f / 2.0f;qDebug() << "Result 2:" << result2;  // 输出: Result 2: 0.5return 0;
}

在这两个示例中,我们都确保了除法运算至少有一个浮点数参与,这样结果就会是浮点数,而不是整数。这样,当你将结果赋值给一个浮点数变量时,你将得到正确的浮点数结果 0.5


总结

QT学习积累——如何提高Qt遍历list的效率


自定义信号和槽

1.自定义信号

写到signals下
返回void
需要声明,不需要实现
可以有参数,可以重戟

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.自定义槽

返回void
需要声明,也需要实现
可以有参数,可以重载
写到public slot下或者public或者全局函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.建立连接

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

// 老师饿了,学生请吃饭
connect(te,&Teacher::hungry,st,&Student::treat);

4.进行触发

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自定义信号重载

当自定义信号和槽出现重载
8.1 需要利用还数指针明确指向函数的地址·
8.2void(Teacher::tsignal )QString )=&Teacher::hungry;
8.3 QString转成char *
8.3.1.ToUtf80转为QByteArray
8.3.2.Data0转为Char *
8.4信号可以连接信号
8.5断开信号disconnect

带参数的

    void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;void (Student::*StudentSlot)(QString) = &Student::treat;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

void Student::treat(QString foodName){// QString -> char * 先转成QByteArray(.toUtf8())  再转成Char* ()qDebug() << "请老师吃。。。" << foodName.toUtf8().data();
}

按钮触发

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    // 用一个按钮调用下课QPushButton *btn = new QPushButton("下课了",this);// 重置窗口daxiaothis->resize(600,400);connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);

信号触发信号

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    // 无参的信号和槽连接void (Teacher::*teacherSignal2)(void) = &Teacher::hungry;void (Student::*StudentSlot2)(void) = &Student::treat;connect(te,teacherSignal2,st,StudentSlot2);// 信号连接信号connect(btn,&QPushButton::clicked,te,teacherSignal2);

断开信号disconnect

拓展

1、信号是可以连接信号
2、一个信号可以连接多个槽函数
3、多个信号可以连接同一个糟函数
4、信号和槽函数的参数必须类型一一对应
5、信号和槽的参数个数是不是要一致?信号的参数个数可以多余槽函数的参数个数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

connect(信号的发送者,发送的信号signal信号),信号接受者,槽函数SLOT)
优点:参数直观
缺点:编译器不会检测爸数类型:

lambda表达式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

在这里插入图片描述

    [=](){btn->setText("aaa");}();

返回值

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    int ret = []()->int{return 1000;}();qDebug() << "ret = " << ret;

mutable修饰

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    QPushButton *myBtn1 = new QPushButton(this);QPushButton *myBtn2 = new QPushButton(this);myBtn1->move(100,100);int m = 10;connect(myBtn1,&QPushButton::clicked,this,[m]()mutable {m=100+10;qDebug()<< m;});connect(myBtn2,&QPushButton::clicked,this,[=](){qDebug()<<m;});qDebug() << m;

案例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    QPushButton * btnClose = new QPushButton;btnClose->setText("close");btnClose->move(100,0);btnClose->setParent(this);connect(btnClose,&QPushButton::clicked,this,[=](){btnClose->setText("关闭");emit te->hungry("娃哈哈");
//        this->close();});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 操作网页

使用selenium库获取网页元素的属性值是一个常见的需求。以下是一个Python代码示例,展示了如何使用selenium来获取一个链接的href属性以及一个输入框的value属性。 首先,请确保您已经安装了selenium库,并且配置了WebDriver(如ChromeDriver)以驱动浏览器。 pythonfrom sele…

如何避免Java中的内存泄漏?

如何避免Java中的内存泄漏&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java开发中&#xff0c;内存泄漏&#xff08;Memory Leak&#xff0…

CSF视频文件格式转换WMV格式(2024年可用)

如果大家看过一些高校教学讲解视频的话&#xff0c;很可能见过这样一个难得的格式&#xff0c;".csf "&#xff0c;非常漂亮 。 用暴风影音都可以打开观看&#xff0c;会自动下载解码。 但是一旦我们想要利用或者上传视频的时候就麻烦了&#xff0c;一般网站不认这…

STM32重定向printf到串口(重写fputc不生效)

使用STM32开发&#xff0c;想用printf把输出打印到串口&#xff0c;需要重定向printf函数。 网上一搜全都是重写fpuc的&#xff0c;但这只针对使用了MicroLIB的情况&#xff0c;如果你使用STM32CubeMX配置了CMake或者Makefile项目&#xff0c;这种方法是根本不可行的&#xff0…

为什么PS5运行游戏的效果往往比号称更强大的Xbox Series X更好?

在第九代游戏机即将进入第四个年头之际&#xff0c;有一个问题仍未得到解答&#xff1a;索尼的 PS5 游戏机的性能如何经常超越纸面性能更强大的微软 Xbox X 系列&#xff1f; 几个明显的例子包括《生化危机 4》、《使命召唤&#xff1a;黑色行动&#xff1a;冷战》和新一代更新…

【支撑文档】系统安全保证措施(word原件)

软件安全保证措施word 软件所有全套资料获取进主页或者本文末个人名片直接。

跨平台营销的智能协同:Kompas.ai如何整合多渠道策略

引言 在数字化营销的今天&#xff0c;消费者的注意力分散在多个平台上。品牌要想有效地吸引和保持消费者的关注&#xff0c;就必须采取跨平台营销策略。Kompas.ai&#xff0c;作为一款智能营销工具&#xff0c;能够帮助品牌实现这一目标。 跨平台营销的重要性 跨平台营销能够…

智慧园区大数据云平台建设方案(Word原件)

第一章 项目建设背景及现状 第二章 园区创新发展趋势 第三章 工业园区大数据存在的问题 第四章 智慧工业园区大数据建设目的 第五章 智慧园区总体构架 第六章 系统核心组件 第七章 智慧工业园区大数据平台规划设计 获取方式&#xff1a;本文末个人名片直接获取。 软件资料清单…

【报错】安装clang-14 的时候,报错E: 无法定位软件包 clang-14

1 报错 安装clang-14,命令如下: sudo apt-get install clang-14 报错为E: 无法定位软件包 clang-14 2 解决方法 使用其他的安装方法,命令如下: wget https://apt.llvm.org/llvm.sh # 添加权限chmod +x llvm.shsudo ./llvm.sh 14 all # 卸载第3步安装过程中安装无用的…

mysql 获取枚举的随机值

mysql 获取枚举的随机值 1.需求描述2.使用到的函数elt函数语法示例 RAND() 函数FLOOR()函数 3.解决方案手写生成&#xff1a;少量数据从表中生成&#xff1a;多数据 4.实战 1.需求描述 在MySQL中&#xff0c;您可以使用ENUM类型定义列&#xff0c;并且可以从中选择随机值。但是…

超融合服务器挂载硬盘--linux系统

项目中需要增加服务器的硬盘容量&#xff0c;通过超融合挂载了硬盘后&#xff0c;还需要添加到指定的路径下&#xff0c;这里记录一下操作步骤。 一&#xff1a;通过管理界面挂载硬盘 这一步都是界面操作&#xff0c;登录超融合控制云台后&#xff0c;找到对应的服务器&#…

uniapp中实现跳转到外部链接(也就是a标签的功能)

uniapp中实现跳转到外部链接&#xff08;也就是a标签的功能&#xff09; 项目中需要做到跳转到外部链接&#xff0c;网上找了很多都不是很符合自己的要求&#xff0c;需要编译成app后是跳转到游览器打开链接&#xff0c;编译成web是在新窗口打开链接。实现的代码如下&#xff1…

矩阵、混剪、大盘,3大功能升级优化!助力企业高效管理!

在数字化转型的浪潮中&#xff0c;企业对于工具与技术的需求愈发强烈。 为满足市场需求&#xff0c;本月【云略】为各企业上线了便捷功能&#xff0c;赋能企业经营决策和业务增长。 矩阵管理 √【矩阵号管理】抖音支持设置城市IP 内容管理 √【混剪任务】支持关联智能发布计…

PDF文档如何统计字数,统计PDF文档字数的方法有哪些?

在平时使用pdf阅读或者是处理文档的时候&#xff0c;常常需要统计文档的字数。pdf在查看文字时其实很简单。 PDF文档是一种常见的电子文档格式&#xff0c;如果需要对PDF文档中的字数进行统计&#xff0c;可以使用以下方法&#xff1a; Adobe Acrobat DC&#xff1a;Adobe Ac…

AI大模型,爆发了

随着ChatGPT用户增速放缓&#xff0c;AI创业公司马太效应加剧&#xff0c;第一轮AI投资热潮逐渐褪去&#xff0c;AI大模型进入“冷静期”。擅长后发制人的腾讯&#xff0c;姗姗来迟&#xff0c;推出了混元大模型&#xff0c;为这一轮AI热潮画上了句号。 AI大模型&#xff0c;开…

Windows安装adb服务/离线安装adb服务

1、问题概述? Android SDK Platform-Tools 是 Android SDK 的一个组件。它包含与 Android 平台进行交互的工具,主要是 adb 和 fastboot。 最近在从事手机app自动化测试,使用到了abd这个服务器,通过adb这个服务,我们可以识别加载Android系统,并执行相对应的操作如:查询…

OpenHarmony开发实战:GPIO控制器接口

功能简介 GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出。通常&#xff0c;GPIO控制器通过分组的方式管理所有GPIO管脚&#xff0c;每组GPIO有一个或多个寄存器与之关联&#xff0c;通过读写寄存器完成对GPIO管脚的操作。 GPIO接口定义了操作GP…

Langchain-Chatchat本地部署记录,三分钟学会!

1.前言&#xff1a; 最近AI爆发式的火&#xff0c;忆往昔尤记得16,17那会移动互联网是特别火热的&#xff0c;也造富了一批公司和个人&#xff0c;出来了很多精妙的app应用。现在轮到AI发力了&#xff0c;想想自己也应该参与到这场时代的浪潮之中&#xff0c;所以就找了开源的…

【微服务网关——https与http2代理实现】

1.https与http2代理 1.1 重新认识https与http2 https是http安全版本http2是一种传输协议两者并没有本质联系 1.1.1 https与http的区别 HTTP&#xff08;超文本传输协议&#xff09;和 HTTPS&#xff08;安全超文本传输协议&#xff09;是用于在网络上交换数据的两种协议。H…

一人独角兽公司会催生新的职业:给AI打工的那些人

最近有篇文章&#xff1a; www.bbc.com/future/article/20240612-the-people-making-ai-sound-more-human 重点介绍了AI在文案写作领域替代人类&#xff0c;导致许多岗位消失&#xff0c;但也创造了低薪的AI文本编辑工作。尽管AI提高了效率&#xff0c;但生成的内容质量较差&am…