Qt学习之路(35): Qt容器类之顺序存储容器

Qt代码-QMultiHash增删改查复制以及优缺点 qDebug() << "键" << targetKey << "的值的数量:" << employeeAges.count(targetKey);qDebug() << "是否包含键" << "赵六" << ":" << employeeAges.contains("赵六");qDebug() << "键:" << it.key() << " 值:" << it.value();qDebug() << "是否包含键值对(" << targetKey << ", 25):"// 相同的键"张三" 阅读详情
本来计划先来说下model/view的,结果发现model/view涉及到一些关于容器的内容,于是就把容器部分提前了。
 
容器Containers,有时候也被称为集合collections,指的是能够在内存中存储其他特定类型的对象的对象,这种对象一般是通用的模板类。C++提供了一套完整的解决方案,成为标准模板库Standard Template Library,也就是我们常说的STL。
 
Qt提供了它自己的一套容器类,这就是说,在Qt的应用程序中,我们可以使用标准C++的STL,也可以使用Qt的容器类。Qt容器类的好处在于,它提供了平台无关的行为,以及 隐式数据共享技术。所谓平台无关,即Qt容器类不因编译器的不同而具有不同的实现;所谓“隐式数据共享”,也可以称作“写时复制copy on write”,这种技术允许在容器类中使用传值参数,而不会发生额外的性能损失。Qt容器类提供了类似Java的遍历器语法,同样也提供了类似STL的遍历器语法,以方便用户选择自己习惯的编码方式。最后一点,在一些嵌入式平台,STL往往是不可用的,这时你就只能使用Qt提供的容器类,除非你想自己创建。
 
今天我们要说的是“顺序储存容器”。所谓顺序存储,就是它存储数据的方式是一个接一个的,线性的。
 
第一个顺序存储容器是QVector<T>,即向量。QVector<T>是一个类似数组的容器,它将数据存储在连续内存区域。同C++数组不同之处在于,QVector<T>知道它自己的长度,并且可以改变大小。对于获取随机位置的数据,或者是在末尾处添加数据,QVector<T>的效率都是很高的,但是,在中间位置插入数据或者删除数据,它的效率并不是很高。在内存中QVector<T>的存储类似下图(出自C++ GUI Programming with Qt4, 2nd Edition):
 
同STL的vector<T>类类似,QVector<T>也提供了[]的重载,我们可以使用[]赋值:
 
QVector< double> v(2); 
v[0] = 1.1; 
v[1] = 1.2;
 
如果实现不知道vector的长度,可以创建一个空参数的vector,然后使用append()函数添加数据:
 
QVector< double> v; 
v.append(1.1); 
v.append(1.2);
 
在QVector<T>类中,<<也被重载,因此,我们也可以直接使用<<操作符:
 
QVector< double> v; 
v << 1.1 << 1.2;
 
注意,如果QVector<T>中的数据没有被显式地赋值,那么,数据项将使用加入类的默认构造函数进行初始化,如果是基本数据类型和指针,则初始化为0.
 
QLinkedList<T>是另外一种顺序存储容器。在数据结构中,这是一个链表,使用指针连接起所有数据。它的内存分布如下(出自C++ GUI Programming with Qt4, 2nd Edition):
正如数据结构中所描述的那样,QLinkedList<T>的优点是数据的插入和删除很快,但是随机位置值的访问会很慢。与QVector<T>不同,QLinkedList<T>并没有提供重载的[]操作符,你只能使用append()函数,或者<<操作符进行数据的添加,或者你也可以使用遍历器,这个我们将在后面内容中详细描述。
 
QList<T>是一个同时拥有QVector<T>和QLinkedList<T>的大多数优点的顺序存储容器类。它像QVector<T>一样支持快速的随机访问,重载了[]操作符,提供了索引访问的方式;它像QLinkedList<T>一样,支持快速的添加、删除操作。除非我们需要进行在很大的集合的中间位置的添加、删除操作,或者是需要所有元素在内存中必须连续存储,否则我们应该一直使用Qlist<T>。
 
QList<T>有几个特殊的情况。一个是QStringList,这是QList<QString>的子类,提供针对QString的很多特殊操作。QStack<T>和QQueue<T>分别实现了数据结构中的堆栈和队列,前者具有push(), pop(), top()函数,后者具有enqueue(), dequeue(), head()函数。具体情况请查阅API文档。
 
另外需要指出的一点是,我们所说的模板类中的占位符T,可以使基本数据类型,比如int,double等,也可以指针类型,可以是类类型。 如果是类类型的话,必须提供默认构造函数,拷贝构造函数和赋值操作符。Qt的内置类中的QByteArray,QDateTime,QRegExp,QString和QVariant是满足这些条件的。但是,QObject的子类并不符合这些条件,因为它们通常缺少拷贝构造函数和赋值操作符。不过这并不是一个问题,因为我们可以存储QObject的指针,而不是直接存储值。T也可以是一个容器,例如:
 
QList<QVector< int> > list;
 
注意,在最后两个>之间有一个空格,这是为了防止编译器把它解析成>>操作符。这个空格是必不可少的,切记切记!
 
下面我们来看一个类(出自C++ GUI Programming with Qt4, 2nd Edition):
 
class Movie 
{ 
public: 
        Movie( const QString &title = "",  int duration = 0); 
 
         void setTitle( const QString &title) { myTitle = title; } 
        QString title()  const {  return myTitle; } 
         void setDuration( int duration) { myDuration = duration; } 
        QString duration()  const {  return myDuration; } 
 
private: 
        QString myTitle; 
         int myDuration; 
};
 
我们能不能把这个类放进Qt容器类呢?答案是肯定的。下面我们来对照着前面所说的要求:第一,虽然这个类的构造函数有两个参数,但是这两个参数都有默认值,因此,像Movie()这种写法是允许的,所以,它有默认构造函数;第二,这个类表面上看上去没有拷贝构造函数和赋值操作符,但是C++编译器会为我们提供一个默认的实现,因此这个条件也是满足的。对于这个类而言,默认拷贝构造函数已经足够,无需我们自己定义。所以,我们可以放心的把这个类放进Qt的容器类。

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/245988

Deepface实战避坑:人脸识别模型VGG-Face、Facenet、ArcFace怎么选?附各模型性能与速度实测对比 本文深入对比了DeepFace框架中VGG-Face、Facenet和ArcFace三种主流人脸识别模型的性能与适用场景,提供了详细的实测数据和选型建议。通过分析各模型在CPU/GPU环境下的推理速度、内存占用和准确率表现,帮助开发者根据实际需求(如门禁系统、相册分类或视频流分析)选择最优模型,并给出工程化部署的避坑指南和优化技巧。 阅读详情

相关推荐

用Python+NumPy手把手实现分数阶傅里叶变换(FRFT),搞定线性调频信号分析

本文详细介绍了如何使用Python和NumPy实现分数阶傅里叶变换(FRFT),特别针对线性调频信号(Chirp信号)分析。通过从零开始的代码实现和可视化案例,展示了FRFT在时变信号处理中的强大能力,帮助工程师和研究人员高效分析频率随时间变化的信号。

weixin_29062823的博客 218

基于Markdown、Git与AI的个人知识管理系统搭建实践

在信息爆炸的时代,高效的知识管理与工作流自动化成为提升个人与团队生产力的关键。Markdown作为一种轻量级标记语言,以其纯文本、平台无关的特性,成为构建可移植、可持续知识库的理想基石。结合Git版本控制系统,不仅能实现文件的版本追踪与协同,更能将工作流程纳入可回溯、可分支管理的范畴。通过将AI大语言模型定位为信息处理与增强工具,而非决策替代者,可以实现会议纪要自动摘要、周报生成、知识库智能问答等场景的自动化。本文以一位技术管理者的实战经验为例,系统阐述了如何整合Markdown、YAML、Git与AI能力

weixin_33923762的博客 250

贝塞尔曲线在机器人路径平滑中的实战应用与优化

本文深入探讨了贝塞尔曲线算法在机器人路径平滑中的核心应用。通过对比G1CBS与G2CBS两种方法,详细阐述了如何实现从切线连续到曲率连续的平滑优化,以满足不同机器人对运动平稳性和效率的需求,并提供了完整的Python代码实现与关键参数调优指南。

weixin_29051811的博客 307

Qt/C++ 借助QVariant实现可存储通用类型的容器

有一种场景的需求如下: 1. 需要一个能够同时存储多种数据类型的容器; 2. 该容器需要提供拷贝的功能; 3. 该容器需要支持序列化与反序列化。 我们姑且将满足以上需求的容器称为可存储通用类型的容器。本文假设项目中使用了Qt库,在此基础上,为实现这种容器提供了一种可行的思路,并给出实现这种容器的要点。

Duran.L的专栏 1704

DataHub 架构设计与核心工作原理

DataHub 是一个第三代数据目录系统,专为现代数据栈设计,支持数据发现、协作、治理和端到端可观测性。其架构采用模型优先的设计理念,注重不同工具和系统之间的互操作性。

北斗云的博客 1224

SNAP计算哨兵二号的叶面积指数(LAI)

对于哨兵二号数据以及LANDSAT8数据,SNAP提供已经集成好的模块计算LAI。在Optical->Thematic Land Processing->Biopyhsical Processor目录下面。 对于经过Sen2Cor处理好的数据,需经过重采样才可进行计算。重采样工具在Raster->Geometric->Resampling。 如果选择Biopyhsical Processor S2_10m进行计算,需要将所有的波段都重采样为10米(哨兵二号的第二波段为10米,可据此波

gxwwww的博客 9417

QT 关于如何生成包含多个自定义类的DLL以及如果调用

QT 生成包含自定义类的dll以及如何调用

xxxcccvvvbbb的博客 1249

Unity 数字孪生笔记1 工具介绍

前言 工欲善其事必先利其器 流程思考 数字孪生本质上一种基于实际物理数据的可视化方案,通过对接实际数据,在三维界面中展示孪生结果。 那么这个流程就很简单了。 整个流程分为三块:数据来源-》数据分析-》数据展示 输入数据 首先我们需要考虑我们能拿到什么。第一,实际物体的三维数据从哪里来,第二,实际数据怎么获取到。 模型数据 工业上常常会用到CAD模型,CAD模型具有精确、统一的特点,但是CAD不是三角面片,我们不能直接导出到Unity中,而且导入之后有很多不合理的地方,例如面片杂乱、面数过高等问题。针对这个

Thissky的专栏 1万+

QList与QVector

看qt的文档,只要是不要求数据所存放的内存是连续的,都建议用QList,因为QList的查询速度跟QVecotr是差不多的。感觉有点奇怪,至少与我之前所认识的List的查询是一不样的。好吧,看看源码的。 原来QList的元素的指针是通过数组来管理的,而不是用next的方式。每当插入或者删除一个元素时,QList就会更新这个指针数组。而查询的时候,QList只需要通过下标从此指针数组中找到元素的指

jjjlike的专栏 5937

lammps案例:扭转

扭转有两种方式,一是固定一端旋转另外一端,二是两端沿相反的方向旋转。案例为两侧旋转方式,扭转后的效果如图所示。

lammps_jiayou的博客 1199

【C#学习记录】如何让界面控件实现自适应布局(Winform)

小伙伴们大家好,我是雷工!在软件界面设计中,客户常常要求设计的界面可以随意缩放,缩放过程中,界面中的按钮等控件也会随着窗体变大缩小自动调整显示位置和尺寸大小。在C#的Winform窗体中如何实现这个效果,下面我们一起学习下。

做有价值的事,积累有价值的笔记! 1万+

[QT编程系列-21]:基本框架 - QT常见数据结构:QString、QList、QVector、QMap、QHash、QSet、QPair详解

QPair提供了一种简便的方式来保存两个不同类型的值,并进行直接访问和操作。它提供了高效的基于键的查找和插入操作,并使用哈希函数来散列键以提高性能。以上是QList的一些常用操作,它还提供了更多的成员函数和功能,如拷贝构造、深拷贝、元素访问等。以上是QString的一些常用操作,它提供了很多其他方法来操作和处理字符串。它提供了方便的插入、删除和访问操作,并支持迭代器和算法等功能。QVector是Qt中的一个动态数组容器类,用于存储同一数据类型的元素。它提供了高效的查找和插入操作,并保持元素的唯一性。

文火冰糖(王文兵)的博客 3891

W5500以太网&PoE扩展模块原理图设计,已量产

本文将以 W5500 以太网 & PoE 扩展板为对象,从嵌入式硬件设计的视角,深度拆解其电路架构、核心器件选型、关键功能实现,以及这款板子解决行业痛点的设计思路。

不脱发的程序猿 941

Qt学习之路

Qt学习之路(1):前言 131274/17 FinderCheng 2009-08-20 Qt学习之路(2):Hello, world! 129097/23 FinderCheng 2009-08-20 Qt学习之路(3):Hello, world!(续) 76679/10 FinderCheng 2009

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 5162

android 蓝牙通讯demo

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Qt4学习之路

Qt学习之路(1):前言 131274/17 FinderCheng 2009-08-20 Qt学习之路(2):Hello, world! 129097/23 FinderCheng 2009-08-20 ...

qq_39160037的博客 258

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Qt QMap简单用法

Qt QMap简单用法

m0_73443478的博客 619

QMap类、 QHash类

QMap类、 QHash类QMap与QHash差别: QMap与QHash差别: ①QHash比QMap查找速度更快。 ②QHash以任意顺序存储,QMap以Key顺序存储数据。 ③QHash的Key必须提供operator==()及一个全局的qHash(Key)函数,而QMap的Key必须提供operator<()函数。 存储一键多值数据时可使用QMultiMap<Key,T>容器或QMultiHash<Key,T>容器。 Java风格迭代器 容器类 只读迭代器 读写

m0_46376834的博客 424

guvcview-源码记录

guvcview 项目摘要 guvcview 是一个 Linux 下的开源 USB 摄像头视频采集工具,采用模块化架构设计。项目包含以下核心模块: 主应用模块:提供 GTK3/Qt6 双界面支持,负责用户交互和功能调度 V4L2 核心模块:处理摄像头设备通信、视频格式转换和图像捕获 渲染模块:实现视频显示、OSD叠加和特效处理,支持 SDL2/SFML 双后端 音频模块:管理音频设备采集和处理 编码模块:负责音视频编码和文件封装 项目结构清晰,各模块通过定义良好的接口通信,支持实时预览、视频录制、截图等功能

洪源兄 1038

大疆LRF文件解析:从原始辐射数据到多光谱图像

LRF是大疆多光谱相机(如M3M、P1)生成的原始辐射数据容器,本质为带时间戳的16位DN值序列,而非可播放的视频格式。其原理基于辐射定标与硬件同步采集,需通过头部解析、辐射校正、地理配准等步骤,将原始DN转换为具有物理意义的辐亮度数据,从而支撑NDVI计算、植被指数分析、精准农业处方图等遥感应用。区别于MP4等可视化格式,LRF的价值在于科学级定量能力——它承载的是波段级绝对辐射值(μW/cm²/sr/nm),是遥感反演与定量分析不可替代的数据本体。本文聚焦LRF结构解密与Python工程化解析,覆盖头部

weixin_30984001的博客 264

[数据结构] [ Qt ] 顺序容器类 QList、QVector、QStack、QQueue

遍历一个容器可以使用迭代器(iterators)来完成,迭代器提供了一个统一的方法来访问容器中的项目。Qt的容器类提供了两种类型的迭代器:Java风格迭代器和STL风格迭代器。如果只是想按顺序遍历一个容器中的项目,那么还可以使用Qt的foreach关键字。

m0_73482095的博客 2042
上一篇: Qt学习之路(34): 国际化(下)
下一篇: Qt学习之路(36): Qt容器类之遍历器和隐式数据共享
flowingFire2012
博客等级 码龄14年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值