Qt中容器 QVector、QList、QSet和QMap 性能与用途比较
- 表格汇总:
容器 | 存储结构 | 随机访问性能 | 插入/删除性能 | 主要用途 |
---|---|---|---|---|
QVector | 连续存储的动态数组 | O ( 1 ) O(1) O(1) | 末尾: O ( 1 ) O(1) O(1),中间: O ( n ) O(n) O(n) | 频繁随机访问,末尾元素的添加/删除 |
QList | 优化存储(类似数组和链表结合) | O ( 1 ) O(1) O(1) | 中间相对高效 | 频繁插入/删除,一定程度的随机访问 |
QSet | 基于哈希表,存储唯一元素 | 不支持 | 平均 O ( 1 ) O(1) O(1),最坏 O ( n ) O(n) O(n) | 存储唯一元素,检查元素存在性 |
QMap | 存储键值对,基于红黑树 | 不支持 | O ( l o g n ) O(log n) O(logn) | 存储键值对,根据键查找值 |
- 存储结构与特点:
- QVector:
- 存储结构:是一个动态数组,元素在内存中是连续存储的。这使得它可以像普通数组一样支持快速的随机访问,通过下标访问元素的时间复杂度为 O ( 1 ) O(1) O(1)。例如,对于
QVector<int> vec;
,可以使用vec[3]
快速访问第 4 个元素(索引从 0 开始)。 - 特点:当添加元素超过其容量时,会自动分配更大的内存空间并复制元素,可能会产生性能开销和内存浪费(预留但未使用的空间)。但对于随机访问操作非常高效,并且由于内存连续性,在缓存利用上有一定优势。
- 存储结构:是一个动态数组,元素在内存中是连续存储的。这使得它可以像普通数组一样支持快速的随机访问,通过下标访问元素的时间复杂度为 O ( 1 ) O(1) O(1)。例如,对于
- QList:
- 存储结构:使用了一种优化的存储方式,结合了数组和链表的特点,并非严格的链表。提供快速的插入和删除操作,并且支持通过索引快速访问元素,时间复杂度为 O ( 1 ) O(1) O(1)。它的内部存储不是完全连续,但在性能表现上类似于同时具备了数组和链表的优点。
- 特点:在中间插入和删除元素时相对高效,相比纯数组结构,其内部存储策略可以更好地处理元素的动态添加和删除操作,同时保持了一定的随机访问能力。
- QSet:
- 存储结构:基于哈希表实现,存储一组唯一元素。元素的存储位置由其哈希值决定,元素是无序的。
- 特点:由于使用哈希表,插入、删除和查找元素的操作在平均情况下时间复杂度接近 O ( 1 ) O(1) O(1),但在最坏情况下可能退化为 O ( n ) O(n) O(n)。它主要用于存储不允许重复元素的集合,并且在判断元素是否存在方面表现出色。
- QMap:
- 存储结构:是一个关联容器,存储键值对,内部基于红黑树实现,键是唯一的。
- 特点:元素是按照键的顺序存储(默认为升序),插入、删除和查找操作的时间复杂度为 O ( l o g n ) O(log n) O(logn)。可以根据键快速查找对应的值,适合需要按键进行查找、排序的场景。
- QVector:
- 性能比较:
- 随机访问:
- QVector:具有最好的随机访问性能,因为其内存连续,对于随机访问密集型操作是最优选择。
- QList:也能提供较好的随机访问性能,但在性能上稍逊于
QVector
,不过在频繁插入和删除元素时,其综合性能可能会优于QVector
。 - QSet:不支持随机访问,其重点在于快速的元素存在性检查和集合操作,如添加、删除元素。
- QMap:不适合随机访问,主要用于通过键查找值,查找性能为 O ( l o g n ) O(log n) O(logn)。
- 插入和删除操作:
- QVector:在末尾插入和删除元素通常比较快,时间复杂度为 O ( 1 ) O(1) O(1),但在中间插入或删除元素时,需要移动大量元素,时间复杂度为 O ( n ) O(n) O(n)。
- QList:在中间插入和删除元素比
QVector
更高效,因为其内部存储结构的优势,但在极端情况下(例如大量元素)可能仍会有一定性能开销。 - QSet:插入和删除元素的平均性能为 O ( 1 ) O(1) O(1),但在哈希冲突较多时性能会下降。
- QMap:插入、删除和查找操作的时间复杂度为 O ( l o g n ) O(log n) O(logn),相对稳定,适合需要维护键值对的有序性和频繁插入、删除键值对的场景。
- 随机访问:
- 用途比较:
- QVector:
- 适合需要频繁随机访问元素,并且元素的添加和删除操作主要在末尾进行的场景。例如,存储图像数据、矩阵元素、传感器读数等,这些数据通常需要根据索引快速访问,且数据增长相对稳定。
- QList:
- 适用于需要频繁插入和删除元素,同时也需要一定程度的随机访问的情况。比如在图形用户界面的列表组件中,用户可以对列表项进行频繁的添加、删除和重新排序操作,同时也可能需要根据索引查看元素。
- QSet:
- 主要用于存储一组唯一元素,并且需要快速检查元素是否存在的情况。例如,存储唯一的用户标识符、已访问过的 URL 集合等。
- QMap:
- 适用于存储键值对,并且需要根据键快速查找值的场景,例如存储配置信息、字典数据,其中键可以是配置项名称或单词,值可以是相应的配置内容或解释。
- QVector:
相关文章:
Qt中容器 QVector、QList、QSet和QMap 性能与用途比较
表格汇总: 容器存储结构随机访问性能插入/删除性能主要用途QVector连续存储的动态数组 O ( 1 ) O(1) O(1)末尾: O ( 1 ) O(1) O(1),中间: O ( n ) O(n) O(n)频繁随机访问,末尾元素的添加/删除QList优化存储࿰…...

ASP.NET Core - 依赖注入(四)
ASP.NET Core - 依赖注入(四) 4. ASP.NET Core默认服务5. 依赖注入配置变形 4. ASP.NET Core默认服务 之前讲了中间件,实际上一个中间件要正常进行工作,通常需要许多的服务配合进行,而中间件中的服务自然也是通过 Ioc…...
数学用语中 up to 的含义
1. 问题 在数学用语中,常见到“up to”这种用法, 但这种用法与我们常规情况下的用法不同,常令人困惑。 2. “等价关系”说明 已知两个数学对象 a 和 b,以及实数域R, • 当 a 和 b是通过 R 关联的࿰…...
Spring Boot + MyBatis-Flex 配置 ProxySQL 的完整指南
✅ Spring Boot MyBatis-Flex 配置 ProxySQL 的完整指南 下面是一个详细的教程,指导您如何在 Spring Boot 项目中使用 MyBatis-Flex 配置 ProxySQL 进行 读写分离 和 主从同步 的数据库访问。 🎯 目标 在 Spring Boot 中连接 ProxySQL。使用 MyBatis-…...

WEB攻防-通用漏洞_XSS跨站_权限维持_捆绑钓鱼_浏览器漏洞
目录 XSS的分类 XSS跨站-后台植入Cookie&表单劫持 【例1】:利用beef或xss平台实时监控Cookie等凭据实现权限维持 【例2】:XSS-Flash钓鱼配合MSF捆绑上线 【例3】:XSS-浏览器网马配合MSF访问上线 XSS的分类 反射型(非持久…...

人工智能任务20-利用LSTM和Attention机制相结合模型在交通流量预测中的应用
大家好,我是微学AI,今天给大家介绍一下人工智能任务20-利用LSTM和Attention机制相结合模型在交通流量预测中的应用。交通流量预测在现代城市交通管理中是至关重要的一环,它对优化交通资源分配以及提升道路通行效率有着不可忽视的意义。在实际…...

Day04-后端Web基础——Maven基础
目录 Maven课程内容1. Maven初识1.1 什么是Maven?1.2 Maven的作用1.2.1 依赖管理1.2.2 项目构建1.2.3 统一项目结构 2. Maven概述2.1 Maven介绍2.2 Maven模型2.2.1 构建生命周期/阶段(Build lifecycle & phases)2.2.2 项目对象模型 (Project Object Model)2.2.3 依赖管理模…...

Hive SQL必刷练习题:留存率问题
首次登录算作当天新增,第二天也登录了算作一日留存。可以理解为,在10月1号登陆了。在10月2号也登陆了,那这个人就可以算是在1号留存 今日留存率 (今日登录且明天也登录的用户数) / 今日登录的总用户数 * 100% 解决思…...

虚拟同步机(VSG)Matlab/Simulink仿真模型
虚拟同步机控制作为原先博文更新的重点内容,我将在原博客的基础上,再结合近几年的研究热点对其内容进行更新。Ps:VSG相关控制方向的simulink仿真模型基本上都搭建出来了,一些重要的控制算法也完成了实验验证。 现在搭建出来的虚拟…...
单头注意力机制(SHSA)详解
定义与原理 单头注意力机制是Transformer模型中的核心组件之一,它通过模拟人类注意力选择的过程,在复杂的输入序列中识别和聚焦关键信息。这种方法不仅提高了模型的性能,还增强了其解释性,使我们能够洞察模型决策的原因。 单头注意力机制的工作流程主要包括以下几个步骤:…...

【漏洞分析】DDOS攻防分析
0x00 UDP攻击实例 2013年12月30日,网游界发生了一起“追杀”事件。事件的主角是PhantmL0rd(这名字一看就是个玩家)和黑客组织DERP Trolling。 PhantomL0rd,人称“鬼王”,本名James Varga,某专业游戏小组的…...

JavaScript动态渲染页面爬取之Splash
Splash是一个 JavaScript渲染服务,是一个含有 HTTP API的轻量级浏览器,它还对接了 Python 中的 Twisted 库和 OT库。利用它,同样可以爬取动态渲染的页面。 功能介绍 利用 Splash,可以实现如下功能: 异步处理多个网页的渲染过程:获取渲染后…...

慧集通(DataLinkX)iPaaS集成平台-系统管理之UI库管理、流程模板
UI库管理 UI库管理分为平台级和自建两种,其中平台级就是慧集通平台自己内置的一些ui库所有客户均可调用,自建则是平台支持使用者自己根据规则自己新增对应的UI库。具体界面如下: 自建UI库新增界面: 注:平台级UI库不支…...
OpenCV相机标定与3D重建(59)用于立体相机标定的函数stereoCalibrate()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 标定立体相机设置。此函数找到两个相机各自的内参以及两个相机之间的外参。 cv::stereoCalibrate 是 OpenCV 中用于立体相机标定的函数。它通过一…...

摄像头模块在狩猎相机中的应用
摄像头模块是狩猎相机的核心组件,在狩猎相机中发挥着关键作用,以下是其主要应用: 图像与视频拍摄 高清成像:高像素的摄像头模块可确保狩猎相机拍摄出清晰的图像和视频,能够捕捉到动物的毛发纹理、行为细节及周围环境的…...
ruoyi-cloud docker启动微服务无法连接nacos,Client not connected, current status:STARTING
ruoyi-cloud docker启动微服务无法连接nacos,Client not connected, current status:STARTING 场景 当使用sh deploy.sh base来安装mysql、redis、nacos环境后,紧接着使用sh deploy.sh modules安装微服务模块,会发现微服务无法连接nacos的情…...
代码随想录算法训练营第三十四天-动态规划-63. 不同路径II
本题与上一题区别不大但由于存在障碍格,导致在计算路径值时,要多考虑一些情况 比如,障碍格在开始与结束位置时,路径直接返回0障碍格在初始的首行与首列时,设置初始值要不同在计算dp值时,要先判断当前格是不…...

在一个sql select中作多个sum并分组
有表如下; 单独的对某一个列作sum并分组,结果如下; 对于表的第7、8行,num1都有值,num2都是null,对num2列作sum、按id分组,结果在id为4的行会显示一个null; 同时对2个列作sum&#x…...

家用电路频繁跳闸的原因及解决方法!
家庭电路跳闸是一个常见的用电故障,正确理解跳闸原因并采取恰当的处理方法,不仅能够及时恢复供电,更能预防潜在的安全隐患。 一、问题分析 断路器跳闸通常是电路保护装置在发现异常时的自动保护行为,主要出现以下几种情况…...

我的年度总结
这一年的人生起伏:从曙光到低谷再到新的曙光 其实本来没打算做年度总结的,无聊打开了帅帅的视频,结合自己最近经历的,打算简单聊下。因为原本打算做的内容会是一篇比较丧、低能量者的呻吟。 实习生与创业公司的零到一 第一段工…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
FTXUI::Dom 模块
DOM 模块定义了分层的 FTXUI::Element 树,可用于构建复杂的终端界面,支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...