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

16QAM调制解调仿真(matlab,详细介绍仿真方案的设计、结果及结论、完整代码及注释) 16QAM调制解调仿真目录一、仿真要求二、仿真方案详细设计三、仿真结果及结论四、仿真代码 一、仿真要求 1.用基带等效的方式仿真16-QAM在AWGN信道下的误码率和误比特率性能,并与理论值相比较; 2.高阶与低阶的性能比较。 二、仿真方案详细设计 三、仿真结果及结论 仿真结果 16QAM的星座点图 64QAM的星座点图 16QAM加噪声后的星座点图 64QAM加噪声后的星座点图 16-QAM载波调制信号在AWGN信道下的误比特率性能比较 结论:由图可知,16QAM的误符号率 阅读详情

相关推荐

OSMDroid 切换地图不更新的问题

用OSMDroid加载Google地图的时候 需要有按钮切换不同图层的地图,如果发现调用了mMapView.setTileSource(ITileSource aTileSource)方法的时候发现地图View没有更新的话,可能是因为两个实例化TileSource对象其子类BitmapTileSourceBase这个类的aName成员变量值一样导致的地图在setTileSource出现不更新问题,...

godoge的博客 1039

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

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

weixin_33923762的博客 250

南京银行信息技术岗提前批笔试与面试

1、笔试 笔试大致可以分为三部分:性格测试、行测题目、专业知识 性格测试 性格测试一般会有较多的体量,可能一共大概有一百多道接近两百道的样子,这个是不限时的。 前面有100道是这样的题目,就是有四个选项都是各种形容词,然后分别选出最符合自己的与最不符合自己的选项。这种题你就顺着自己的潜意识填就行了,但是前后要一致,我怀疑他出这么多题,可能就是考一考你记不记得前面填了啥。比如你做到第90题的时候,可能会出现和前面第2题类似的四个形容词,更有甚者就是一模一样的,你要对自己之前选的什么有个比较清楚的记忆。

qq_40971025的博客 6922

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

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

Duran.L的专栏 1704

C++动态规划详解

动态规划思想 一、动态规划概念: 动态规划(dp)是研究多步决策过程最优化问题的一种数学方法。在动态规划中,为了寻找一个问题的最优解(即最优决策过程),将整个问题划分成若干个相应的阶段,并在每个阶段都根据先前所作出的决策作出当前阶段最优决策,进而得出整个问题的最优解。即记住已知问题的答案,在已知的答案的基础上解决未知的问题。 在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后

weixin_51951103的博客 2万+

基于SolidWorks宏的草图点坐标自动化提取与Excel集成

本文详细介绍了如何利用SolidWorks宏编程实现草图点坐标的自动化提取并与Excel集成,显著提升机械设计效率。通过VBA代码解析与优化,解决了人工记录坐标耗时易错的问题,并扩展了多草图批量处理、数据可视化等高级功能,适用于数控加工、质量检测等场景。

weixin_29251131的博客 461

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

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

xxxcccvvvbbb的博客 1249

科研党必备!用Requests+BeautifulSoup升级版Nature爬虫(含PDF下载功能)

本文介绍了一套基于Python Requests和BeautifulSoup的Nature期刊智能爬虫系统,专为科研人员设计,可自动抓取论文标题、摘要及开放获取的PDF文档。系统采用模块化设计,包含请求管理、PDF检测和邮件通知等功能,确保高效合规地获取学术资源,提升科研效率。

weixin_29041767的博客 256

QList与QVector

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

jjjlike的专栏 5937

STM32F103单片机驱动TM1637数码管显示模块

最近项目中需要用到数码管显示,于是买了一个TM1637芯片驱动的四位数码显示模块,现将调试过程记录一下,方便以后参考。 使用的单片机是STM32F103C8T6最小系统 使用的数码管模块是TM1637四位数码管显示模块 实际运行效果 下面先看一下TM1637和数码管连接的具体线路图 实际使用的模块没有带按键,只用了4个数码管,模块和单片机连接只需要4根线VCC、GND、CLK、DIO。芯片和单片机通信使用的是I2C总线,下面就来说一下如何...

HXYDJ的博客 1万+

使用下一代的嵌入式IDE-PlatformIO 教程

1.生成工程 1.1 打开STM32CubeMX: 选择你的MCU,这里我用的是STM32F103RC RCC中开启外部HSE时钟,外部时钟比HSI更稳定些 开启DEBUG 4线 打开串口1用于打印调试信息,波特率115200,校验位0,停止位1 打开串口2用于MODBUS协议,波特率9600,校验位0,停止位1 接入RT-thread:参考官方文档 基于 CubeMX 移植 RT-Thread Nano 根据官方文档,需要1.取消生成HardFault_Handler、PendSV_Handler、Sy

jiladahe1997的博客 3万+

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

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

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

FreeRTOS全攻略:从入门到精通

本文聚焦 FreeRTOS,从基础概念出发,阐述其开源、轻量级等优势。着重介绍 FreeRTOS 入门知识,涵盖内存管理、任务操作、同步互斥机制等核心内容。其中,空闲任务与钩子函数保障系统基础运行与功能扩展;队列、信号量、互斥锁和事件组等机制,分别从数据传递、资源访问控制、优先级问题解决及多任务同步等方面,为开发者提供高效的任务间协作与资源管理方案,助力开发者掌握 FreeRTOS 核心技术,为嵌入式项目开发筑牢基础。

邓邓子的博客 6358

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Qt4学习之路

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

qq_39160037的博客 258

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Qt QMap简单用法

Qt QMap简单用法

m0_73443478的博客 619

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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、付费专栏及课程。

余额充值