QT--[常用容器类]--QVector

news2024/12/28 20:42:29

QVector 是 Qt 框架中提供的一个动态数组类,类似于标准 C++ 中的 std::vector。它用于存储同一类型的元素,并提供了丰富的操作接口,以方便对数据进行管理和操作。

1. 什么是 QVector

QVector 是一个模板类,用于存储动态大小的数组。它支持随机访问,并提供了动态扩展的能力。与静态数组不同,QVector 可以根据需要自动调整大小,允许在运行时添加或删除元素。

1.1 头文件包含

在使用 QVector 之前,需要包含相应的头文件:

cpp

#include <QVector>

2. 特点

  • 动态大小QVector 可以根据需要动态调整其大小,而不需要手动管理内存。
  • 高效的随机访问:支持随机访问,使用下标访问元素的效率很高,时间复杂度为 O(1)。
  • 支持多种数据类型QVector 可以存储任何类型的数据,只要该类型能够被复制。
  • 内存管理QVector 自动管理内存,避免手动分配和释放内存的复杂性。

3. 基本用法

3.1 创建和初始化

可以通过以下方式定义和初始化 QVector

cpp

QVector<int> vec; // 创建一个存储整数的 QVector
QVector<QString> strVec{"Hello", "World"}; // 初始化 QVector

3.2 添加元素

使用 append() 方法向 QVector 添加元素:

cpp

vec.append(10);
vec.append(20);
vec.append(30);

3.3 插入元素

使用 insert() 方法在指定位置插入元素:

cpp

vec.insert(1, 15); // 在索引 1 处插入元素 15

3.4 访问元素

可以使用下标运算符访问元素:

cpp

int firstElement = vec[0]; // 访问第一个元素

3.5 遍历元素

可以使用范围基于的 for 循环或迭代器遍历 QVector

cpp

for (const auto &value : vec) {
    qDebug() << value;
}

// 使用迭代器
for (auto it = vec.begin(); it != vec.end(); ++it) {
    qDebug() << *it;
}

3.6 删除元素

使用 remove()removeAt() 方法删除元素:

cpp

vec.remove(1); // 删除索引 1 处的元素
vec.removeAt(0); // 删除第一个元素

3.7 清空和重置

使用 clear() 方法可以清空 QVector 中的所有元素:

cpp

vec.clear();

4. 性能特性

4.1 时间复杂度

  • 访问元素:O(1)(随机访问)
  • 添加元素:平均 O(1),但在扩容时可能达到 O(n)
  • 删除元素:O(n)(删除后续元素需要移动)

4.2 内存管理

QVector 自动管理内存,使用了动态数组的机制。当元素数量超过当前容量时,QVector 会自动扩展容量,通常会以两倍的方式增加,确保在大多数情况下保持操作的高效性。

5. 与其他容器的比较

5.1 QVector vs QList

  • QVector:适合频繁的随机访问,内存布局连续,性能较好。
  • QList:适合频繁的插入和删除操作,使用双向链表实现,内存布局不连续。

5.2 QVector vs std::vector

  • QVector:提供了 Qt 特有的信号和槽机制,适合与 Qt 其他部分集成。
  • std::vector:标准 C++ 容器,通常在非 Qt 项目中使用。

6. 使用场景

6.1 数据存储

QVector 适合用于存储需要动态调整大小的集合,例如用户输入的数据、文件读取的内容等。

6.2 数学计算

在进行数学运算时,QVector 可以用于存储向量或矩阵的行或列,方便进行相关操作。

6.3 图形应用

在图形应用中,QVector 可用于存储图形元素的坐标、颜色等属性。

6.4 数据缓存

通过 QVector 可以实现对数据的快速缓存,以提高程序的性能。

7. 示例代码

以下是一个简单的示例,展示了如何使用 QVector

cpp

#include <QCoreApplication>
#include <QVector>
#include <QString>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 创建 QVector
    QVector<int> numbers;

    // 添加元素
    numbers.append(1);
    numbers.append(2);
    numbers.append(3);

    // 插入元素
    numbers.insert(1, 5); // 在索引 1 处插入 5

    // 遍历元素
    qDebug() << "Numbers in QVector:";
    for (const auto &num : numbers) {
        qDebug() << num;
    }

    // 删除元素
    numbers.removeAt(0); // 删除第一个元素

    // 输出当前元素
    qDebug() << "After removal:";
    for (const auto &num : numbers) {
        qDebug() << num;
    }

    return a.exec();
}

7.1 输出结果

basic

复制

Numbers in QVector:
1
5
2
3
After removal:
5
2
3

8. 总结

QVector 是 Qt 中一个非常实用的动态数组类,适用于需要高效存储和访问数据的场景。通过理解 QVector 的基本操作和性能特性,开发者可以更好地管理动态数据,提高程序的效率和可读性。

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

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

相关文章

Windows 11 中部署 Linux 项目

一、总体思路 在 Windows 11 中部署 Linux 项目&#xff0c;主要是借助 Windows Subsystem for Linux&#xff08;WSL&#xff09;来实现。在WSL中新建基于Linux的项目虚拟环境&#xff0c;以供WIN下已克隆的项目使用。WSL 允许在 Windows 系统上运行原生的 Linux 二进制可执行…

【ETCD】【实操篇(十五)】etcd集群成员管理:如何高效地添加、删除与更新节点

etcd 是一个高可用的分布式键值存储&#xff0c;广泛应用于存储服务发现、配置管理等场景。为了确保集群的稳定性和可扩展性&#xff0c;管理成员节点的添加、删除和更新变得尤为重要。本文将指导您如何在etcd集群中处理成员管理&#xff0c;帮助您高效地维护集群节点。 目录 …

数据结构与算法Python版 平衡二叉查找树AVL

文章目录 一、平衡二叉查找树二、AVL树测试三、AVL树-算法分析 一、平衡二叉查找树 平衡二叉查找树-AVL树的定义 AVL树&#xff1a;在key插入时一直保持平衡的二叉查找树。可以利用AVL树实现抽象数据类型映射Map。与二叉查找树相比&#xff0c;AVL树基本上与二叉查找树的实现…

【Redis】Redis 安装与启动

在实际工作中&#xff0c;大多数企业选择基于 Linux 服务器来部署项目。本文演示如何使用 MobaXterm 远程连接工具&#xff0c;在 CentOS 7 上安装和启动 Redis 服务&#xff08;三种启动方式&#xff0c;包括默认启动、指定配置启动和开机自启&#xff09;。在安装之前&#x…

通过Js动态控制Bootstrap模态框-弹窗效果

目的&#xff1a;实现弹出窗、仅关闭弹窗之后才能操作&#xff08;按ESC可退出&#xff09;。自适应宽度与高度、当文本内容太多时、添加滚动条效果。 效果图 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

el-table合并单元行后的多选框选中问题

问题描述 合并单元行以后&#xff0c;首列的多选框也会合并&#xff0c;此时选中该多选框其实是只选中了合并单元行的第一行的多选框&#xff0c;其他的都未被选中。 解决方案 原本想着手动去修改表头的半选状态和全选状态 &#xff0c;但是没有找到相关方法&#xff0c;后面觉…

电脑缺失libcurl.dll怎么解决?详解电脑libcurl.dll文件丢失问题

一、libcurl.dll文件丢失的原因 libcurl.dll是一个用于处理URL传输的库文件&#xff0c;广泛应用于各种基于网络的应用程序。当这个文件丢失时&#xff0c;可能会导致相关应用程序无法正常运行。以下是libcurl.dll文件丢失的一些常见原因&#xff1a; 软件安装或卸载不完整&a…

图文教程:使用PowerDesigner导出数据库表结构为Word/Html文档

1、第一种情况-无数据库表&#xff0c;但有数据模型 1.1 使用PowerDesigner已完成数据建模 您已经使用PowerDesigner完成数据库建模&#xff0c;如下图&#xff1a; 1.2 Report配置和导出 1、点击&#xff1a;Report->Reports&#xff0c;如下图&#xff1a; 2、点击&…

UE--如何用 Python 调用 C++ 及蓝图函数

前言 先讲下如何用 Python 调用 C 函数吧。 详细可见我的上篇文章 最关键的一点就是得在函数上加一个宏&#xff1a;UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable) static bool GetOrCreatePackage(const FString& PackagePath, UPackage*& OutPackag…

小程序租赁系统开发的优势与实践探索

内容概要 小程序租赁系统开发正在引起广泛关注&#xff0c;特别是在数字化快速发展的今天。很多企业开始意识到&#xff0c;小程序不仅能为他们带来更多的客户&#xff0c;还能极大地提高管理效率。借助小程序&#xff0c;用户在租赁时可以更加方便地浏览和选择产品&#xff0…

闲谭Scala(3)--使用IDEA开发Scala

1. 背景 广阔天地、大有作为的青年&#xff0c;怎么可能仅仅满足于命令行。 高端大气集成开发环境IDEA必须顶上&#xff0c;提高学习、工作效率。 开整。 2. 步骤 2.1 创建工程 打开IDEA&#xff0c;依次File-New-Project…&#xff0c;不好意思我的是中文版&#xff1a;…

富芮坤FR800X系列之PWM输出程序应用设计

文章目录 前言1.设计背景2.简介3.如何设计控制调光的接口呢4.硬件设计5.软件设计5.1.软件流程图5.2.软件代码 6.小结 前言 版权归作者所有、未经允许、请勿转载。 读者对象&#xff1a; 本文档主要适用以下工程师&#xff1a; 嵌入式系统工程师 单片机软件工程师 IOT固…

node-js Express防盗链

什么是防盗连 一个简单的说明&#xff0c;假如在前端img标签想要引用图片网站上的图片&#xff0c;当你将图片地址放到img标签上想要显示的时候你发现&#xff0c;图片显示不了&#xff0c;这说明网站采用了防盗链。 怎么实现的呢 在请求头中一般会有 Referer&#xff0c;它…

使用ArcGIS/ArcGIS pro绘制六边形/三角形/菱形渔网图

在做一些尺度分析时&#xff0c;经常会涉及到对研究区构建不同尺度的渔网进行分析&#xff0c;渔网的形状通常为规则四边形。构建渔网的方法也很简单&#xff0c;使用ArcGIS/ArcGIS Pro工具箱中的【创建渔网/CreateFishnet】工具来构建。但如果想构建其他形状渔网进行相关分析&…

RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)

文章目录 十.RabbitMQ10.1 简单队列实现10.2 Work 模式&#xff08;工作队列&#xff09;10.3 公平分发10.4 RabbitMQ 消息应答与消息持久化消息应答概念配置 消息持久化概念配置 十.RabbitMQ 10.1 简单队列实现 简单队列通常指的是一个基本的消息队列&#xff0c;它可以用于…

nexus docker安装

#nexus docker 安装 docker pull sonatype/nexus3 mkdir -p /data/nexus-data docker run -itd -p 8081:8081 --privilegedtrue --name nexus3 \ -v /data/nexus-data:/var/nexus-data --restartalways docker.io/sonatype/nexus3 #访问 http://192.168.31.109:8081/ 用户名&am…

ADC(二):外部触发

有关ADC的基础知识请参考标准库入门教程 ADC&#xff08;二&#xff09;&#xff1a;外部触发 1、TIM1的CC1事件触发ADC1DMA重装载2、TIM3的TRGO事件(的更新事件)触发ADC1DMA重装载3、TIM3的TRGO事件(的捕获事件)触发ADC1DMA重装载4、优化TIM3的TRGO事件(的捕获事件)触发ADC1D…

【产品应用】一体化无刷电机在旋转等离子喷枪中的应用

在现代工业制造与加工领域&#xff0c;等离子喷枪凭借其高温、高速的等离子射流&#xff0c;能够实现高效的材料表面处理、切割以及焊接等工艺&#xff0c;在众多行业中发挥着关键作用。而一体化无刷电机的应用&#xff0c;更是为等离子喷枪的性能提升和稳定运行注入了强大动力…

ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制

文章目录 Pre概述什么是 composite aggregation&#xff1f;基本结构after 参数的作用问题背景&#xff1a;传统分页的重复问题after 的设计理念响应示例 after 如何确保数据不重复核心机制Example步骤 1: 创建测试数据创建索引插入测试数据 步骤 2: 查询第一页结果查询第一页返…

易基因: BS+ChIP-seq揭示DNA甲基化调控非编码RNA(VIM-AS1)抑制肿瘤侵袭性|Exp Mol Med

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 肝细胞癌&#xff08;hepatocellular carcinoma&#xff0c;HCC&#xff09;早期复发仍然是一个具有挑战性的领域&#xff0c;其中涉及的机制尚未完全被理解。尽管微血管侵犯&#xff08…