【Qt】常用的容器
Qt提供了多个基于模板的容器类,这些容器类可用于存储指定类型的数据项。例如常用的字符串列表类 QStringList 可用来操作一个 QList<QString>列表。
Qt的容器类比标准模板库(standard template library,STL)中的容器类更轻巧、使用更安全且更易于使用。这些容器类是隐式共享和可重入的,而且它们进行了速度和存储上的优化,因而可以减小可执行文件大小。此外,它们是线程安全的,即它们作为只读容器时可被多个线程访问。
容器类是基于模板的类,例如常用的容器类 QList<T>,T是一种具体的类型,可以是 int、fioat等简单类型,也可以是 QString、QDate 等类。T必须是一种可赋值的类型,即T必须提供一个默
认的构造函数、一个可复制构造函数和一个赋值运算符。Qt6 的容器类有 QList、QVector、QStack 、QQueue、 QSet、QMap、QMultilMap、QHash、QMultiHash
一、QList
在Qt中,QList是一个模板类,用于存储一组对象的动态数组。它提供了方便的方法来访问、增加、删除和修改列表中的元素。
QList与C++的标准库容器std::vector类似,但它还提供了一些额外的功能和方便的操作符重载。下面是一些QList的常用操作:
- 添加元素:使用append()、prepend()等方法将元素添加到列表的末尾或开头。
- 访问元素:使用at()方法通过索引访问列表中的元素,使用operator[]操作符也可以实现相同的功能。
- 删除元素:使用removeOne()、removeAt()等方法删除列表中的元素。
- 修改元素:使用replace()方法替换列表中的元素。
- 列表大小:使用size()方法获取列表的大小,使用isEmpty()方法检查列表是否为空。
- 迭代访问:使用foreach循环或迭代器对列表进行迭代访问。
除了这些常用方法外,QList还提供了一些其他的功能,如排序、查找、截取子列表等。可以在Qt的官方文档中查看完整的QList类接口和用法。
注意:在使用QList时,需要包含头文件#include <QList>。
二、QVector
在Qt中,QVector是一个模板类,用于存储一组对象的可变大小的数组。它与QList相似,但在某些方面具有不同的特性和性能特点。
与QList相比,QVector在以下情况下可能更适合使用:
1. 读取和访问速度:QVector提供了随机访问的性能优势。如果需要频繁地通过索引访问元素,QVector通常比QList更快。
2. 内存占用:QVector的内存占用通常比QList小,因为它可以更有效地管理和分配内存。
3. 插入和删除操作:对于插入和删除操作,QList通常比QVector更快,尤其在大型数据集的情况下。
除了上述的区别,QVector和QList提供了类似的方法和操作符重载,如append()、prepend()、at()、removeOne()、replace()、size()等等。可以在Qt的官方文档中查看完整的QVector类接口和用法。
注意:在使用QVector时,需要包含头文件#include <QVector>。
三、QStack
QStack是Qt中的一个模板类,它是一个栈容器类,用于实现栈数据结构。
栈(Stack)是一种后进先出(Last-In-First-Out, LIFO)的数据结构,只能在栈的一端(称为栈顶)进行插入和删除操作。
QStack类提供了以下公共成员函数:
- void push(const T &value):将value插入到栈的顶部。
- void pop():移除栈顶的元素。
- T &top():返回栈顶的元素的引用。
- const T &top() const:返回栈顶的元素的常量引用。
- bool isEmpty() const:判断栈是否为空。
- int size() const:返回栈中元素的个数。
QStack类可以存储任意类型的数据,并且提供了访问、插入和删除元素的方法。可以使用QStack类来实现各种栈相关的操作。
四、QQueue
QQueue是Qt中的一个类,用于表示队列数据结构。队列是一种先进先出(First In First Out,FIFO)的数据结构,元素从队列的一端添加,从另一端删除。
QQueue类提供了以下方法来操作队列:
- enqueue:在队列的末尾添加一个元素。
- dequeue:删除队列的头部元素,并返回该元素。
- head:返回队列的头部元素,但不删除它。
- isEmpty:判断队列是否为空。
- size:返回队列中元素的个数。
使用QQueue类,可以方便地实现队列的操作。例如,在一个多线程程序中,可以使用QQueue来作为线程之间共享的数据结构,一个线程往队列中添加数据,另一个线程从队列中取出数据进行处理。
五、 QSet
QSet是Qt中的一个类,用于表示集合数据结构。集合是一种不包含重复元素的数据结构,它提供了高效的查找和插入操作。
QSet类提供了以下方法来操作集合:
- insert:向集合中插入一个元素。
- remove:从集合中删除一个元素。
- contains:判断集合中是否包含某个元素。
- size:返回集合中元素的个数。
QSet类还提供了遍历集合元素的方法,如使用迭代器进行迭代或使用foreach循环
六、QMap
QMap是Qt中的一个类,用于存储键值对的容器。QMap类中的每个元素都是由一个键和一个值组成的。键用于唯一标识一个元素,而值则是与该键关联的数据。QMap中的元素按照键的排序进行存储,并且可以根据键快速地访问到对应的值。这使得QMap非常适用于需要根据键值进行查找、插入和删除操作的场景。QMap类提供了一系列方法来操作存储在其中的键值对,比如插入、移除、查找和遍历等方法。以下是QMap类的一些常用方法:
- insert(key, value):在QMap中插入一个键值对,如果键已经存在,则会更新对应的值。
- remove(key):从QMap中移除一个指定键的元素。
- contains(key):判断QMap中是否包含指定的键。
- value(key):返回指定键对应的值。
- keys():返回QMap中所有的键。
- values():返回QMap中所有的值。
- size():返回QMap中键值对的个数。
- clear():移除QMap中的所有元素。
QMap还提供了一些其他的功能,比如按范围查找、排序等。需要注意的是,QMap中的键是唯一的,不允许出现重复的键。如果插入了重复的键,则会替换掉之前的键值对。使用QMap时,需要注意元素的排序和查找的效率。如果需要按照键的顺序进行访问,可以使用QMap的有序版本QMap。QMap类是基于红黑树实现的,因此它的插入、删除和查找操作的时间复杂度为O(log n),其中n是QMap中元素的个数。
注意:使用QMap类需要包含头文件#include <QMap>。
七、QMultilMap
QMultiMap是Qt中的一个类,它是QMap的多重映射版本。QMultiMap类与QMap类一样,同时存储了键值对,但与QMap不同的是,QMultiMap允许存在相同的键,即一个键可以对应多个值。QMultiMap类提供了一系列方法来操作多重映射中的键值对,包括插入、移除、查找和遍历等操作。与QMap类相似,QMultiMap类也按照键的排序进行存储,并且可以通过键快速访问到对应的值。对于相同的键,QMultiMap会按照插入的顺序保存多个值。以下是QMultiMap类的一些常用方法:
- insert(key, value):在QMultiMap中插入一个键值对。
- remove(key):从QMultiMap中移除一个指定键的所有元素。
- remove(key, value):从QMultiMap中移除一个指定键值对。
- values(key):返回指定键对应的所有值。
- contains(key):判断QMultiMap中是否包含指定的键。
- keys():返回QMultiMap中所有的键。
- size():返回QMultiMap中键值对的个数。
- clear():移除QMultiMap中的所有元素。
QMultiMap也提供了按范围查找、排序等功能。使用QMultiMap时,可以很方便地处理一个键对应多个值的情况,比如用于处理消息订阅、事件处理等场景。 需要注意的是,QMultiMap中的键可以重复,但是如果插入了相同的键值对,则会保存多个值,而不会替换掉之前的值。QMultiMap类也是基于红黑树实现的,因此插入、删除和查找操作的时间复杂度为O(log n),其中n是QMultiMap中元素的个数。
八、QHash
QHash是Qt中的一个类,用于实现哈希表(Hash Table)数据结构。QHash类类似于C++ STL中的std::unordered_map,它提供了一种以键值对的方式存储和访问数据的方法。与QMap类不同的是,QHash并不会对其元素进行排序,而是通过哈希函数将键转化为索引,并通过索引直接访问元素,从而实现了快速查找和插入。QHash类提供了一系列方法来操作哈希表中的元素,包括插入、移除、查找和遍历等操作,以下是QHash类的一些常用方法:
- insert(key, value):在QHash中插入一个键值对。
- remove(key):从QHash中移除一个指定键的元素。
- value(key):返回指定键对应的值。
- contains(key):判断QHash中是否包含指定的键。
- keys():返回QHash中所有的键。
- values():返回QHash中所有的值。
- size():返回QHash中键值对的个数。
- clear():移除QHash中的所有元素。
QHash的底层实现使用了哈希表技术,通过哈希函数将键转换为索引,并使用链地址法解决哈希冲突。因此,对于大多数操作,QHash的时间复杂度为O(1)。值得注意的是,QHash对键的顺序并不做保证,即无法保证键的插入顺序和遍历顺序是一致的。QHash类还提供了与STL兼容的迭代器,可以使用迭代器来遍历QHash中的元素。使用QHash时,需要保证键类型是可哈希的(即提供了哈希函数),并支持比较操作符。QHash在很多场景中都是非常有用的,比如用于快速查找和存储大量的键值对,或者用于实现缓存、索引结构等。
相关文章:
【Qt】常用的容器
Qt提供了多个基于模板的容器类,这些容器类可用于存储指定类型的数据项。例如常用的字符串列表类 QStringList 可用来操作一个 QList<QString>列表。 Qt的容器类比标准模板库(standard template library,STL)中的容器类更轻巧、使用更安全且更易于使…...
基于UKF-IMM无迹卡尔曼滤波与交互式多模型的轨迹跟踪算法matlab仿真,对比EKF-IMM和UKF
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于UKF-IMM无迹卡尔曼滤波与交互式多模型的轨迹跟踪算法matlab仿真,对比EKF-IMM和UKF。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 .…...
分布式事务组件Seata简介与使用,搭配Nacos统一管理服务端和客户端配置
文章目录 一. Seata简介二. 官方文档三. Seata分布式事务代码实现0. 环境简介1. 添加undo_log表2. 添加依赖3. 添加配置4. 开启Seata事务管理5. 启动演示 四. Seata Server配置Nacos1. 修改配置类型2. 创建Nacos配置 五. Seata Client配置Nacos1. 增加Seata关联Nacos的配置2. 在…...
JavaScript常用的内置构造函数
JavaScript作为一种广泛应用的编程语言,提供了丰富的内置构造函数,帮助开发者处理不同类型的数据和操作。这些内置构造函数在创建和操作对象时非常有用。本文将详细介绍JavaScript中常用的内置构造函数及其用途。 常用内置构造函数概述 1. Object Obj…...
25寒假算法刷题 | Day1 | LeetCode 240. 搜索二维矩阵 II,148. 排序链表
目录 240. 搜索二维矩阵 II题目描述题解 148. 排序链表题目描述题解 240. 搜索二维矩阵 II 点此跳转题目链接 题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到…...
MQTT知识
MQTT协议 MQTT 是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用而设计,可以用极少的代码为联网设备提供实时可靠的消息服务。MQTT 协议广泛应用于物联网、移动互联网、智能硬件、车联网、智慧城市、远程医疗、…...
【机器学习与数据挖掘实战】案例11:基于灰色预测和SVR的企业所得税预测分析
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数据集中发现模式、关联…...
新一代搜索引擎,是 ES 的15倍?
Manticore Search介绍 Manticore Search 是一个使用 C 开发的高性能搜索引擎,创建于 2017 年,其前身是 Sphinx Search 。Manticore Search 充分利用了 Sphinx,显着改进了它的功能,修复了数百个错误,几乎完全重写了代码…...
使用 Context API 管理临时状态,避免 Redux/Zustand 的持久化陷阱
在开发 React Native 应用时,我们经常需要管理全局状态,比如用户信息、主题设置、网络状态等。而对于某些临时状态,例如 数据同步进行中的状态 (isSyncing),我们应该选择什么方式来管理它? 在项目开发过程中ÿ…...
PyTorch框架——基于深度学习YOLOv8神经网络学生课堂行为检测识别系统
基于YOLOv8深度学习的学生课堂行为检测识别系统,其能识别三种学生课堂行为:names: [举手, 读书, 写字] 具体图片见如下: 第一步:YOLOv8介绍 YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本…...
word2vec 实战应用介绍
Word2Vec 是一种由 Google 在 2013 年推出的重要词嵌入模型,通过将单词映射为低维向量,实现了对自然语言处理任务的高效支持。其核心思想是利用深度学习技术,通过训练大量文本数据,将单词表示为稠密的向量形式,从而捕捉单词之间的语义和语法关系。以下是关于 Word2Vec 实战…...
C# 操作符重载对象详解
.NET学习资料 .NET学习资料 .NET学习资料 一、操作符重载的概念 在 C# 中,操作符重载允许我们为自定义的类或结构体定义操作符的行为。通常,我们熟悉的操作符,如加法()、减法(-)、乘法&#…...
python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素均值处理
【1】引言 前序学习进程中,对图像的操作均基于各个像素点上的BGR值不同而展开。 对于彩色图像,每个像素点上的BGR值为三个整数,因为是三通道图像;对于灰度图像,各个像素上的BGR值是一个整数,因为这是单通…...
CNN的各种知识点(四): 非极大值抑制(Non-Maximum Suppression, NMS)
非极大值抑制(Non-Maximum Suppression, NMS) 1. 非极大值抑制(Non-Maximum Suppression, NMS)概念:算法步骤:具体例子:PyTorch实现: 总结: 1. 非极大值抑制(…...
虚幻基础16:locomotion direction
locomotion locomotion:角色运动系统的总称:包含移动、奔跑、跳跃、转向等。 locomotion direction 玩家输入 玩家输入:通常代表玩家想要的移动方向。 direction 可以计算当前朝向与移动方向的Δ。从而实现朝向与移动(玩家输入)方向的分…...
C++游戏开发实战:从引擎架构到物理碰撞
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 C 是游戏开发中最受欢迎的编程语言之一,因其高性能、低延迟和强大的底层控制能力,被广泛用于游戏…...
代理模式——C++实现
目录 1. 代理模式简介 2. 代码示例 1. 代理模式简介 代理模式是一种行为型模式。 代理模式的定义:由于某些原因需要给某对象提供一个代理以控制该对象的访问。这时,访问对象不适合或者不能直接访问引用目标对象,代理对象作为访问对象和目标…...
什么情况下,C#需要手动进行资源分配和释放?什么又是非托管资源?
扩展:如何使用C#的using语句释放资源?什么是IDisposable接口?与垃圾回收有什么关系?-CSDN博客 托管资源的回收有GC自动触发,而非托管资源需要手动释放。 在 C# 中,非托管资源是指那些不由 CLR(…...
LeetCode 2909. 元素和最小的山形三元组 II
**### LeetCode 2909. 元素和最小的山形三元组 II 问题描述 给定一个下标从 0 开始的整数数组 nums,我们需要找到一个“山形三元组”(i, j, k)满足以下条件: i < j < knums[i] < nums[j] 且 nums[k] < nums[j] 并…...
搬迁至bilibili声明
我将搬迁到bilibili ,用户名:北苏清风 在这个用户名上的文章部分将出自csdn的这个账号,均属于本人原创...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
