(二十四)容器的遍历、隐式共享

【信息科学与工程学】【数据中心】第二十四篇 数据中心DaaS场景及算法 Flink, Kafka Streams, 时序数据库。Flink, Kafka Streams, 流处理引擎。Presto, ClickHouse, 查询加速引擎。Presto, ClickHouse, 查询加速引擎。延迟<50ms,可用性>99.99%,QPS>10K。REST API, GraphQL, API网关。Tableau, Power BI, 自助BI。Tableau, Power BI, 可视化库。Spark, Hadoop, 分布式计算框架。Spark, Hadoop, 分布式计算。 阅读详情

Qt中迭代分为两类

1、  只读迭代器:不能改写对待器指向的数据

2、  读写迭代器:可以更改迭代器指向的数据

 

Qt中Java风格的迭代器:

1、只读迭代器类:Q + “容器名” + Iterator,如QVectorIterator<T>为只读向量迭代器,其中QVectorIterator是模板类,并不是类型,需要指定信息说明实例化为什么类型QVectorIterator<T>

2、读写迭代器类: QMutable+ “容器名” + Iterator,如QMutableVectorIterator<T>

 

Java风格的迭代器指向位置:


Java风格的迭代器并不直接指向容器中的任何元素,而是指向第一个元素之前、两个元素间或者最后一个元素之后的位置

 

遍历:

当一个迭代器被构造之后,会默认的指向容器中第一个元素之前的位置,我们可以通过成员函数:

bool

hasNext () const

与

const T &

next ()

相配合来进行从前向后的遍历,当迭代器后面有一个元素时,hasNext ()将会返回真,这种情况下使用next ()就可以返回后一个元素的引用并使迭代器指向下一个位置

 

QList<float> list;
 ...
 QListIterator<float> i(list);    //Java风格迭代器
 while (i.hasNext())
    qDebug() << i.next();


如果需要向前遍历,可以使用成员函数

void

toBack ()

bool

hasPrevious () const

const T &

previous ()

相配合,先将迭代器指向最后一个元素之后的位置,当迭代器前面有一个元素时hasPrevious ()返回真,使用previous ()返回前一个元素的引用并使迭代器指向上一个位置,读写 迭代器与只读迭代器遍历方式一致

 

Qt中的STL风格迭代器:

1、只读迭代器:Class<T>::const_iterator    其中,Class指Qt中的容器模板类

2、读写迭代器:Class<T>::iterator

 

STL风格迭代器指向位置:


跟STL中的迭代器一样,Qt中容器模板类的成员函数

iterator

begin ()

const_iterator

begin () const

返回的STL风格的迭代器指向容器中第一个元素,成员函数

iterator

end ()

const_iterator

end () const

返回的STL风格的迭代器指向容器不存在的尾后元素(容器中最后一个元素后的不存在元素),可以通过begin ()与end ()的返回值是否一致来判定容器是否为空,容器也为我们提供了更方便的方法,使用成员函数

bool

isEmpty () const

 

遍历:

可以通过自增++或自减—运算符使STL风格迭代器移动到下一个位置(下一个元素或尾后迭代器)

QList<QString> list;
 list<< "A" << "B" << "C" <<"D";
 
 QList<QString>::iterator i;     //STL风格迭代器
 for(i = list.begin(); i != list.end(); ++i)
    *i = (*i).toLower();
 


注意:如果要使用STL风格的迭代器遍历某些函数返回的容器,我们应该先获得那个返回的容器的拷贝,再遍历这个拷贝

const QList<int> sizes = splitter->sizes();      //隐式共享(拷贝构造,引用计数+1,不发生深拷贝)
 QList<int>::const_iterator i;
 for(i = sizes.begin(); i != sizes.end(); ++i)
    //...
 

而不是向下面这样使用:

QList<int>::const_iterator i;
 for(i = splitter->sizes().begin(); 
	i !=splitter->sizes().end(); ++i)
 //...

这样使用会带来大量的开销,因为splitter->sizes()返回的是一个临时对象,每次循环都创建一个临时对象(QList<int>),而执行流到下一行的时候临时对象被摧毁

 

使用Java风格的迭代器时,无需先获取返回的容器的拷贝,由于隐式共享的关系,只要我们进行只读操作,将不会引发拷贝,当我们进行了写操作时Qt会自动为我们拷贝数据,我们无需做任何额外的操作。

使用Java风格的迭代器:

QListIterator<int>i(splitter->sizes());    //隐式共享(拷贝构造,引用计数+1,不发生深拷贝)
while (i.hasNext())
{
	//doSomething(i.next());
}


隐式共享:

有了隐式共享我们可以写这样的代码而不用担心性能问题

//实现
QVector<double> sineTable()   
{   
	QVector<double> vect(345,360);   
	//... 
	return vect;   
}
// 调用
QVector<double> v = sineTable();    //隐式共享

如果没有隐式共享的话,实现的方式就应该变化了,就应该使用使用pass-by-reference的方式来避免返回时发生的拷贝,有了隐式共享我们甚至可以这样写:

QVector<double>& sineTable()    //返回引用
{   
	QVector<double> vect(345, 360);    //local对象
	//...
	return vect;   
}

QVector<double> v = sineTable();    //隐式共享

这里我们返回了局部对象的引用!!!!!这在C++中是绝对不被建议的(有疑问可以参考”Effective C++” 条款21)

 

Qt中所有容器类以其类QByteArray,QBrush, QFont, QImage, QPixmap和QString都使用了隐式共享技术。

 

为了更好的发挥隐式共享的优势

1、在访问QList<T>与QVector<T>时,我们应该尽量避免使用

成员函数

const T &

at ( int i ) const

而不是重载的数组操作符

T &

operator[] ( int i )

2、在使用STL风格的迭代器遍历容器类时,只要在非常量的容器类上调用begin ()或end (),并且如果数据是隐式共享的,Qt将会强制执行深层拷贝,我们应该使用const_iterator、

const_iterator

constBegin () const

const_iterator

constEnd () const

 

 

 

【信息科学与工程学】计算机科学与自动化——第二十四篇 编译器04 LLVM编译器01 训推一体方案通过整合训练与推理流程,实现资源复用、效率提升和全链路自动化。以下从。 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第二十四篇 编译器04 LLVM编译器02

B-WUCL(用户权重均匀对比损失)和D-WUCL(物品权重均匀对比损失)中,动态调整参数λ_new(新用户补偿因子)和α(长尾补偿强度)是优化推荐系统适应数据分布变化的核心。

weixin_49199313的博客 1243

QList使用详解

`QList` 是 Qt 提供的一个泛型容器类,类似于 C++ 的标准模板库中的 `std::vector`,用于存储一系列元素。`QList` 可以存储任何类型的对象,并且支持高效的插入、删除和访问操作。

啊渊的专栏 8641

从零到一:树莓派上的YOLO目标检测实战指南

本文详细介绍了如何在树莓派上部署和优化YOLO目标检测模型,从硬件选型到系统配置,再到模型转换与推理优化。通过对比不同树莓派型号的性能差异,提供实用的配置方案和代码示例,帮助开发者快速实现高效的边缘计算视觉系统。特别推荐使用ONNX格式进行模型转换,以提升在树莓派上的推理效率。

weixin_29046035的博客 1063

QT 容器类浅拷贝(隐式共享)问题初探

【代码】QT 容器类浅拷贝(隐式共享)问题初探。

weixin_43757125的博客 559

EEGLAB+ERPLAB实战:从.cnt文件到情绪ERP差异波,一份避坑指南

本文详细介绍了使用EEGLAB和ERPLAB处理Neuroscan的.cnt格式脑电数据的全流程,从数据导入、预处理到情绪ERP差异波生成。重点解决了采样率验证、事件标记检查、重参考选择、滤波策略与ICA组合等实操难题,并提供了情绪图片ERP研究中P1、EPN和LPP成分的分析技巧,帮助研究者避免常见错误,提升数据处理效率。

weixin_26795617的博客 264

STM32 ST-LINK Utility 无法烧录程序的解决方法

当你打开STM32 ST-LINK Utility,硬件连接好st-link V2,打开了要烧写的文件,点那个Program verify烧录时, 如果出错了: Programming error @ 0x08000000! 我的方法是: 点你想要烧录那个HEX文件的小格,复制 然后去到你前面的文件的格子里,点粘贴: 成功! ...

wocute的博客 9521

【正点原子Linux连载】 第十七章 CAN Bus 摘自【正点原子】I.MX6U嵌入式Qt开发指南V1.0.2

正点原子I.MX6U开发板底板上预留了一路CAN接口(6U芯片最大支持两路)。如下图。在正点原子【正点原子】I.MX6U用户快速体验V1.x.pdf里也有相关的CAN测试方法。这里就不多介绍CAN了,编者默认读者是会使用CAN的。同时不对CAN总线协议进行讲解,主要是讲解如何在Qt里对CAN编程。...

weixin_55796564的博客 853

ADS 2024实战:手把手教你搞定2.3-3.5GHz宽带Doherty功放仿真与版图(附源文件)

本文详细解析了在ADS 2024环境中实现2.3-3.5GHz宽带Doherty功放的全流程设计,包括仿真与版图实现。从软件环境搭建、器件模型导入到核心电路设计、匹配网络优化,再到系统集成与版图生成,提供了实战技巧和关键参数设置。特别针对5G通信和卫星应用中的高效率需求,展示了如何通过ADS 2024的新功能提升设计效率。

weixin_42639246的博客 461

揭秘 Qt “零拷贝” 黑科技:隐式数据共享如何兼顾值语义的安全与引用语义的高效?

Qt隐式数据共享是一种内存优化技术,通过写时复制机制实现高效内存管理。其核心原理是多个对象共享同一数据块,仅在修改时进行复制。Qt通过QSharedData和QSharedDataPointer两个类实现该功能:QSharedData维护引用计数,QSharedDataPointer负责数据生命周期管理和写时复制触发。该技术具有线程安全特性,广泛应用于QString、QList等Qt容器类,能显著减少内存拷贝开销。开发者也可通过继承QSharedData实现自定义共享类,在修改数据前调用detach()确保

Ceylan__的博客 1773

泛微OA E9文档管理优化:临时文件清理与存储配置指南

本文深入解析了泛微OA E9系统性能下降的常见原因——临时文件堆积,并提供了完整的优化配置指南。文章详细介绍了临时文件的产生机制,并手把手指导管理员如何通过修改存储路径、调整保留时间、设置白名单等关键配置,有效清理与管理系统临时文件,从而释放存储空间,提升系统运行效率与稳定性。

tree8的博客 431

OpenHands:开源AI智能体开发平台实战指南与架构解析

AI智能体(Agent)作为人工智能领域的关键技术,通过模拟人类的推理与行动循环,能够自主规划并执行复杂任务。其核心原理基于ReAct(Reasoning and Acting)框架,结合规划、工具使用与记忆系统,实现了从感知到决策的闭环。在软件工程领域,AI智能体的技术价值在于将自然语言指令转化为具体的开发操作,从而显著提升代码生成、测试编写和系统维护的效率。典型的应用场景包括自动化代码重构、智能文档生成以及持续集成流程的优化。本文聚焦于OpenHands这一开源AI驱动开发平台,它提供了完整的智能体SD

weixin_27021789的博客 459

Qt隐式共享与显式共享

Qt中的很多C++类都使用了隐式数据共享来最大化资源使用和最小化拷贝代价。隐式共享类在作为参数传递时,不仅安全而且高效,因为只是指向数据的指针被传递了,底层的数据只有在函数向它执行写动作时才会发生拷贝,即写时拷贝。

3718

【WLAN】【调试】再谈如何使用Wireshark解密WiFi数据包——使用TK信息

- 本文介绍了一种wireshark使用TK信息解密空口报文的方式,该方式对是否有关联过程的报文没有要求。

一介草民,只为生活。 1188

HarmonyOS 6深度解析:LuoPanPage 组件的 build 方法使用 Stack 作为根容器,内含两层——底层是主内容区的 Column,上层是三个条件渲染的弹窗

在 HarmonyOS NEXT 正式商用的背景下,ArkTS 作为鸿蒙生态的官方应用开发语言,正在从传统的命令式 UI 开发范式向声明式 UI 范式全面迁移。ArkUI 框架以组件化、声明式、状态驱动为核心特征,要求开发者以"描述 UI 应该是什么样"而非"一步步操作 UI 怎么变"的思维方式构建界面。

jin421352的博客 209

海思图像质量之HiPQTool调试

文章目录一. HiPQTool 界面二. 图像调试三. 将调试参数写入程序中 一. HiPQTool 界面 二. 图像调试 三. 将调试参数写入程序中

lzg2011的博客 2381

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

7-Zip-zstd 压缩指南:6 种算法怎么选

7-Zip-zstd 是 7-Zip 增强版,集齐 Zstandard、Brotli、LZ4 等 6 种压缩算法,按需求挑速度或压缩率,适合爱折腾归档的用户。 ## 📦 7-Zip-zstd 核心能力速览 - 一个工具同时压 6 种算法,还兼容原生 7z 格式 - 支持多线程压缩,大文件速度提升明显 - 能直接生成 .zst、.lz4 等独立压缩文件,解压也支持 ## 🔍 7-Zip-z

gitblog_00021的博客 212

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

自习舱如何连接空位、地图与提醒?ArkUI 共享学习空间实战

在共享经济席卷教育场景的当下,共享自习室正从"一张桌子一把椅子"的粗放模式,进化为舱位级颗粒度管理的精细化运营形态。从早鸟场的入座率监控到晚高峰的抢座提醒,从门店地图的长按标记到铃声坊的自定义提示音,每一个预约决策都需要位置感知、数据可视化和通知触达能力的深度协同。传统预约类应用常面临三重困境:地图仅作展示缺乏交互深度、通知铃声千篇一律无法个性化、运营数据停留在文字列表缺乏视觉直觉。面对这些挑战,开发者需要一套既能快速构建精美界面、又能深度整合系统能力的开发框架,而 HarmonyOS ArkUI 正是为此

kathy_tan的博客 187

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【中国方言题库|12】HarmonyOS ArkTS 题库列表组件实战:减少多地区页面重复并保证点击反馈

基于真实 ArkTS 源码复核 BANKS 数据、BankListPage 排序与响应式容器、BankCard 进度回显和整卡路由,明确当前仅有排序而无筛选分页。

2401_84996024的博客 350

HarmonyOS ArkTS API 24天灯祈福使用 TypeScript 的参数属性简写语法(如 constructor(public name: string)),而是采用了传统的显式赋值方式

在 HarmonyOS NEXT 正式商用的背景下,ArkTS 作为鸿蒙生态的官方应用开发语言,正在从传统的命令式 UI 开发范式向声明式 UI 范式全面迁移。ArkUI 框架以组件化、声明式、状态驱动为核心特征,要求开发者以"描述 UI 应该是什么样"而非"一步步操作 UI 怎么变"的思维方式构建界面。本文以一个名为"智能账单"的三标签页记账应用为切入点,逐层拆解其数据模型设计、@Builder 组件复用策略、@State 状态管理机制、条件渲染导航模式,以及静态写死渲染与动态循环渲染之间的性能权衡,为

jin421352的博客 206

C++实现24点游戏:从算法到工程实践

表达式求值是计算机科学中的基础问题,其核心在于将数学表达式转换为计算机可执行的指令序列。其原理通常涉及栈数据结构与递归算法,通过中缀转后缀或直接递归解析来处理运算符优先级与括号。掌握表达式求值技术对于理解编译器设计、计算器开发及算法优化具有重要价值,广泛应用于数学软件、游戏逻辑及金融计算等场景。本文以经典的24点游戏为切入点,深入探讨了如何运用C++的STL容器、递归分割算法及浮点数精度控制等热词技术,实现一个结构清晰、可扩展的求解器,为算法学习与工程实践提供了完整范例。

weixin_30258901的博客 368

Day527&528&529.图灵学院之面试题③ -面经

图灵学院之面试题③ 一、HashMap的扩容机制原理是什么? 新建一个老数组的两倍大小的新组,遍历老数组,且若含有链表,就再遍历(套了两层遍历)。根据hash+新数组容量计算出新数组数组下标位置,并转移到新数组。 1.8 若遍历链表时,发现为红黑树,依然重新计算新数组所对应的下标(老数组对应一个红黑色的位置,不代表新数组的位置是相同) ,经过再计算后,再次判断是否需要建立生成红黑色(代表扩容后,之前的红黑树会被拆分为链表+链表或链表+红黑树或不同位置的红黑树或仍然是相同位置的红黑树)。 二、Conc

阿昌爱Java 3173

烘焙工坊移动应用源代码深度解析:基于HarmonyOS ArkTS API 24各内容页面通过 @ObjectLink 装饰器与共享数据模型建立双向绑定,实现数据的响应式传递

健身管理类应用与之前分析的外卖、招聘等应用有本质差异——它的核心数据不是"交易"或"任务",而是"时间序列的身体状态数据":每次训练有时长、卡路里、组数、重量;每次饮食有热量、蛋白质、碳水、脂肪;每周有运动时长趋势图。这些数据的共同特征是"随时间积累,用户需要横向对比和趋势分析"。这导致健身App的数据层设计必须从第一天就考虑"历史数据查询"和"多维度聚合"的需求,而非仅关注当前单条记录的增删改查。健身应用的用户行为模式也有独特之处:用户使用健身App的目标是"坚持",而不是"一次性完成任务"。这意味着激励

qq_17776737的博客 142

HarmonyOS 6效果实现:基于原生组件搭建多Tab双排架构,实现页面路由与视图无缝切换效果

在移动互联网与智能设备高速发展的今天,非物质文化遗产的传承与传播已经从单纯的线下演示,演变为一种高度数字化、流程化、个性化的线上线下融合体验。鲁班锁,又名孔明锁、八卦锁,是中国古代传统的土木建筑固定结合器,距今已有数千年历史。它起源于古代建筑中的榫卯结构,不用钉子和绳子,完全靠自身结构的连接支撑,展现了一种看似简单却不平凡的智慧。一只好锁,从选材、画线、凿卯、制榫到拼装、打磨,需经数十道工序,凝聚着匠人的心血与木作的温润。六通锁的精巧、二十四锁的繁复、菠萝锁的别致、九龙壁的雄浑、三才锁的简约、八卦锁的玄妙,

qq63160596的博客 254

【Java校招面试】实战面经(七)

点击这里,返回本专栏的索引文章点击这里,返回上一篇《【Java校招面试】实战面经(六)》

石沉溪洞 469

Devtron Rollout Deployment Chart v3.12 部署模板配置完全指南

Devtron 的 Rollout Deployment Chart(v3.12,即 `reference-chart_3-12-0`)是应用部署模板(Deployment Template)的核心 Helm Chart 之一,它基于 Argo Rollouts 的 `Rollout` 资源,为应用提供容器端口、健康检查、滚动/蓝绿发布策略、自动扩缩容、Ingress、持久化卷、亲和性调度与可观测

gitblog_00450的博客 269

HarmonyOS 6声明式范式的户外露营装备租赁与营地预订应用深度技术解析,ArkUI 提供的 Scroll、List、Grid、Swiper 等容器组件,以及 ForEach 渲染控制语句

在移动互联网与智能穿戴设备高度普及的今天,"习惯养成"已经从一个模糊的自我管理理念,演变为一个可量化、可追踪、可视化的数字化产品赛道。越来越多的人希望借助手中的智能终端,把"早起、冥想、阅读、运动"这些抽象的自律行为,转化为一条条清晰的数据曲线和一张张可触摸的打卡卡片。而鸿蒙生态(HarmonyOS)凭借其跨设备协同、分布式软总线以及声明式 UI 开发框架 ArkUI,为这类注重"轻量化交互 + 即时反馈"的生活方式类应用提供了极为理想的生长土壤。本应用正是一款面向"晨间场景"深度打磨的习惯追踪工具。它聚焦

jin123322的博客 218
上一篇: (二十三)Qt中的容器类简介
下一篇: (二十五)Qt : 隐式数据共享(copy on write)
早起的虫儿灬
博客等级 码龄10年 54粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值