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

目录

1. QT常见数据结构概述

2. QList与QVector比较

3. QPair和QMap比较

4. QT数据结构与STL库数据结构比较

5. QT数据结构与STL库数据结构性能比较


1. QT常见数据结构概述 

在Qt中,有几个主要的数据结构常用于处理和组织数据,包括:

  1. QString:用于存储和操作字符串的类。QString是Qt中常用的字符串类型,提供了丰富的字符串操作方法和快速的字符串处理能力。

  2. QList:动态数组,可用于存储同一数据类型的多个元素。它可以方便地进行插入、删除和访问操作,提供了一系列的成员函数和迭代器来操作元素。

  3. QVector:和QList类似,也是动态数组,但通常比QList更适合于元素的快速访问和遍历操作。

  4. QMap:键值对的容器,用于存储和查找映射关系。提供快速的键值访问和搜索能力,以及对映射的排序和迭代等操作。

  5. QHash:类似于QMap,是一个存储键值对的容器,但不保证元素的顺序。在查找和插入操作上比QMap更快效率,适合于大量数据的快速查找。

  6. QSet:无序集合,用于存储不重复的元素。提供了高效的插入、查找和删除操作,适用于处理集合问题。

  7. QPair:存储一对值(不是键值对)的容器,可用于将多个值组合起来。

这些数据结构是Qt中常用的几个,它们在不同的场景中具有不同的优势和适用性。

你可以根据具体的需求选择合适的数据结构来处理和组织数据。

请查阅Qt文档以获取更详细的信息和使用示例。

2. QList与QVector比较

QList和QVector是Qt中两个常用的容器类,用于存储同一数据类型的多个元素。

它们在使用和性能方面有所不同,可以根据具体的需求选择适合的容器。

以下是QList和QVector的一些比较:

  1. 内存分配方式:这是它们最根本的差别

    • QList:使用双向链表实现,元素在内存中不是连续存储的,适合频繁的插入和删除操作。但由于链表的结构,访问元素的速度较慢。
    • QVector:使用连续的内存块存储元素,可以快速访问任意索引处的元素,适合频繁的随机访问操作
  2. 插入和删除操作:

    • QList:由于使用链表实现,插入和删除元素的速度较快,不需要移动其他元素。
    • QVector:在末尾(或预分配的空间)插入和删除元素速度很快,但在中间插入和删除元素需要移动后面的元素,性能较差。
  3. 随机访问操作:

    • QList:访问元素需要从链表的头部或尾部开始遍历,对于大型数据集,访问速度较慢。
    • QVector:由于连续的内存块存储,可以直接根据索引快速访问元素,适用于频繁的随机访问操作。
  4. 内存占用:

    • QList:额外的链表节点引入了一定的内存开销,对于大量小型元素的容器,可能占用更多的内存。
    • QVector:作为连续内存块存储元素,没有额外的链表节点开销,内存占用较少。

根据以上特点,QList适合处理需要频繁插入和删除元素的情况,而QVector适合需要频繁随机访问元素的情况。如果对于特定用例,你既需要快速插入和删除,又需要快速随机访问,你可以根据实际情况做出选择或者考虑使用其他更适合的容器类。

需要注意的是,对于一般情况下,两者之间的性能差异通常不会对程序的整体性能产生显著影响。因此,正确选择适合自己需求的容器类更为重要。

3. QPair和QMap比较

QPair和QMap是Qt中的两个不同的容器类,用于不同的目的。

QPair是一个用于存储两个值的通用容器类。它适用于需要将两个不同类型的值组合在一起的情况,但不提供键值对的查找和排序等功能。通过QPair,你可以方便地访问和操作这两个值,但无法根据键进行查找或按键排序。

相比之下,QMap是一个关联容器类,用于存储键值对。它提供了基于键的查找和插入操作,并可以按键进行排序。QMap可以根据键快速检索对应的值,并提供了按键排序的功能,因此在需要根据键进行查找和排序的情况下,QMap更适合使用。

如果你需要存储键值对并且希望可以根据键进行查找和排序,那么应该选择使用QMap。如果只是简单地需要将两个不同类型的值组合在一起,而不涉及到查找和排序,那么QPair就足够了。

需要根据具体的需求来选择使用QPair还是QMap,它们各自在不同的场景下具有不同的优势和用途。

4. QT数据结构与STL库数据结构比较

Qt数据结构与STL(标准模板库)库数据结构之间有一些区别和比较,下面是一些主要的比较点:

  1. 类型命名和名称空间:

    • Qt数据结构:Qt数据结构以"Q"开头,如QString、QList、QVector等,并位于Qt命名空间中。
    • STL数据结构:STL数据结构以常见的命名方式命名,如string、vector、list等,并位于std命名空间中。
  2. 所属框架和依赖关系:

    • Qt数据结构:Qt数据结构是Qt框架的一部分,主要用于Qt应用程序的开发。它们与Qt的其他模块和功能紧密集成,依赖于Qt框架
    • STL数据结构:STL数据结构是C++标准库的一部分,可以在任何支持C++标准库的C++环境中使用,不依赖于特定的框架。
  3. 额外的功能和扩展:

    • Qt数据结构:Qt数据结构通常提供了与Qt框架其他部分紧密集成的特定功能,例如信号和槽机制、Qt元对象系统等。
    • STL数据结构:STL数据结构提供了一组通用的容器、算法和迭代器,没有与特定框架或库集成的特定功能。
  4. Qt元对象系统支持:

    • Qt数据结构:Qt数据结构可以通过Qt的元对象系统进行信号和槽的连接,实现动态的事件处理。
    • STL数据结构:STL数据结构不具备直接的元对象系统支持,无法与信号和槽机制进行连接,它们主要用于数据存储和处理。
  5. API和使用方式:

    • Qt数据结构:Qt数据结构提供了与Qt风格一致的API,具有自己特定的成员函数和用法,与其他Qt组件紧密集成。
    • STL数据结构:STL数据结构遵循C++标准库的设计原则,提供了一致的、通用的API,与其他C++标准库容器和算法相似。

需要根据具体的需求和场景来选择使用Qt还是STL数据结构。如果你正在使用Qt框架开发应用程序,并需要与其他Qt模块紧密集成,那么Qt数据结构可能更适合。如果你在纯C++环境中编写代码,并且只需要通用的容器和算法,那么STL数据结构可能是更合适的选择。

5. QT数据结构与STL库数据结构性能比较

在性能方面,Qt数据结构和STL库数据结构有一些区别和比较。

以下是一些常见的性能比较点:

  1. 内存管理和存储布局:

    • Qt数据结构:Qt数据结构通常需要额外的内部指针和元数据,以支持Qt的特定功能,如动态特性和信号槽机制。这可能导致一些额外的内存开销。
    • STL库数据结构:STL库数据结构通常使用紧凑的内存布局,仅存储元素本身,没有额外的内部指针和元数据。这可以减少内存开销。
  2. 插入和删除操作:

    • Qt数据结构:由于Qt的一些数据结构(如QList和QVector)使用指针遍历基于链表或数组实现的内部数据结构,因此插入和删除元素时的性能可能较好。
    • STL库数据结构:STL库的一些数据结构(例如std::list和std::vector)在插入和删除元素时可能需要移动或重新分配内存,因此在大量插入和删除操作的情况下性能可能较差。
  3. 随机访问操作:

    • Qt数据结构:Qt的一些数据结构(如QVector和QByteArray)使用基于数组的内部存储,可以快速随机访问元素,性能较好。
    • STL库数据结构:STL库的一些数据结构(例如std::vector)同样使用基于数组的内部存储,也可以快速随机访问元素,性能较好。

需要注意的是,对于一般的使用情况,Qt数据结构和STL库数据结构之间的性能差异通常不会对程序的整体性能产生显著影响。因此,在选择数据结构时,主要考虑的应该是功能需求和代码整洁度,而不仅仅是性能因素。

当遇到性能敏感的情况时,建议进行具体的性能测试和分析,根据实际情况选择更合适的数据结构。此外,对于特定的性能优化需求,还可以考虑使用其他更高级的数据结构或自定义优化方案。

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

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

相关文章

数据库用户管理

数据库用户管理 一、创建: 1.新建用户: CREATE USER 用户名来源地址 [IDENTIFIED BY [PASSWORD] 密码];‘用户名’:指定将创建的用户名. ‘来源地址’:指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机…

Docker 应用容器引擎

Docker 应用容器引擎 一、Docker是什么二、Docker安装和查看1、docker安装2、docker版本信息查看3、docker信息查看 三、镜像操作四、容器操作1、容器创建2、创建并启动容器3、容器的进入4、复制5、容器的导入和导出6、删除容器 一、Docker是什么 是一个开源的应用容器引擎&…

ROS:nodelet

目录 一、前言二、概念三、作用四、使用演示4.1案例简介4.2nodelet 基本使用语法4.3内置案例调用 五、nodelet实现5.1需求5.2流程5.3准备5.4创建插件类并注册插件5.5构建插件库5.6使插件可用于ROS工具链5.6.1配置xml5.6.2导出插件 5.7执行 一、前言 ROS通信是基于Node(节点)的…

【动手学深度学习】--15.含并行连结的网络GoogLeNet

文章目录 含并行连结的网络GoogLeNet1.Inception块2.GoogLeNet模型3.训练模型 含并行连结的网络GoogLeNet 学习视频:含并行连结的网络 GoogLeNet / Inception V3【动手学深度学习v2】 官方笔记:含并行连结的网络(GoogLeNet) 1.…

【云原生】容器镜像

v ljx97609760 一起沟通学习 容器镜像 容器镜像(Image)所承载的是封装了应用程序及其所有软件依赖的二进制数据。 容器镜像是可执行的软件包,可以单独运行 你通常会创建应用的容器镜像并将其推送到某仓库(Registry)&…

Appium-Python-Client 源码剖析 (一) driver 的元素查找方法

目录 前言 源码版本:0.9 结构图: mobileby.py appium 的 webdriver.py selenium 的 webdriver.py seleniumdriver appiumdriver 前言 Appium-Python-Client是一个用于Python语言的Appium客户端库,它提供了丰富的API和功能,用于编写和…

【LeetCode】594. 最长和谐子序列

594. 最长和谐子序列(简单) 方法:哈希表计数 思路 题目规定的「和谐子序列」中的最值差值正好为 1,因而子序列排序后必然符合[a,a,.., a 1,a1]形式,即符合条件的和谐子序列长度为相邻两数(差值为 1)的出现次数之和。…

国产单片机(沁恒微WCH)CH32V307评估板初探

国产单片机(沁恒微WCH)CH32V307评估板初探 关于沁恒微:国产芯厂家、官网链接 公司简介 - 南京沁恒微电子股份有限公司 (wch.cn) 开发板资源: 评估板应用于 CH32V307 芯片的开发,IDE 使用 MounRiver 编译器,可选择使用板载或独…

为何异地销号这么难?这些注意事项要熟记!

最近有不少小伙伴私信小编,他们在网上办理的大流量手机号卡,用了一段时间之后想换其他的卡,所以想注销当前用的卡,但是注销的时候确实屡屡碰壁,程序还比较繁琐,有的甚至申请注销了几个月还注销不掉&#xf…

面向对象Java基础

前言 看大话设计模式的时候,发现自己的基础不是很扎实,重新回顾一些存在有点点不确定的内容,并从书中截取下来,做成笔记快速复习。 1、字段和属性 字段:用private修饰,也叫私有变量。属性:字…

关于uniapp分享功能实现

创建一个混入 export default {data() {return {//设置默认的分享参数//如果页面不设置share,就触发这个默认的分享share: {title: 商会宝,//自定义标题path: /pages/home/home?appId${uni.getStorageSync("appid")}, //默认跳转首页imageUrl: , //可…

Microsoft Outlook 共享收发邮件的权限给其他人

点击File 点击Account Settings→DelegateAccess 点击Add

[java安全]CommonsCollections1(LazyMap)

文章目录 【java安全】CommonsCollections1(LazyMap)前言LazyMap如何创建LazyMap对象?如何调用LazyMap的get()方法?如何触发AnnotationInvocationHandler#invoke()方法?POC总结参考 【java安全】CommonsCollections1(LazyMap) 前言 前面我们…

菜单 三级检索的实现,可配置搜索是否包含标题

const asideTreeDataOrigin [ //? 原始的侧边栏数据,不可修改 ]; let asideTreeData JSON.parse(JSON.stringify(asideTreeDataOrigin)); //? 动态的实时展示的侧边栏数据const menuCheck (val, menuItem) > menuItem.name.indexOf(val) > -1 || menuIte…

Hadoop: High Available

序言 在Hadoop 2.X以前的版本,NameNode面临单点故障风险(SPOF),也就是说,一旦NameNode节点挂了,整个集群就不可用了,而且需要借助辅助NameNode来手工干预重启集群,这将延长集群的停…

Python学习笔记-Windows下VirtualEnv+VSCode中虚拟环境配置

1 VirtualEnv简介 VirtualEnv是一个虚拟化环境,是独立开的开发环境,在一个文件夹中创建的独立虚拟环境,可以分隔开不同项目,开发互不影响。 优点如下: 使不同的应用开发环境独立,避免互相干扰环境升级不…

RxSwift 使用方式

背景 最近项目业务,所有模块已经支持Swift混编开发,正在逐步使用Swift 方式进行开发新业务,以及逐步替换老业务方式进行发展,所以使用一些较为成熟的Swift 的三方库,成为必要性,经过调研发现RxSwift 在使用…

lvs使用

1.前言 LVS(Linux Virtual Server)是一个基于 Linux 内核的负载均衡器,用于分发网络流量和将请求转发给后端服务器。LVS 提供了多种负载均衡算法和转发模式,以满足不同场景和需求的负载均衡需求,在LVS中定义虚拟服务的…

制作Visual Studio离线安装包

vs2015之后官网就不提供离线安装包了,使用离线安装包就需要自己手动制作一个; 以vs2019为例: 先去官网下载在线安装器 官网下载地址:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com) 展开2019的标签…

#SQL常见错误信息表 mysql导入数据出错常见错误

mysql的出错代码表,根据mysql的头文件mysql/include/mysqld_error.h整理而成。错误之处,请大家指正。 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存…