Qt基础:数据容器类
数据容器类
- 1. QList
- 1.1 使用
- 创建和初始化
- 添加和删除元素
- 访问和修改元素
- 查找和判断元素
- 遍历列表
- 排序和筛选
- 与其他容器的转换
- 1.2 完整示例
1. QList
在Qt中,QList 是一个动态数组容器类,用于存储和管理相同类型的元素。它提供了快速随机访问、动态扩展和丰富的操作方法,是Qt中最常用的容器类之一。
- 功能:实现动态数组,支持快速随机访问和动态增长。
- 底层实现:基于数组,在元素数量超过预分配空间时自动重新分配内存。
- 特点:
- 支持索引访问(如
list[0]
)。 - 可动态添加、删除元素。
- 提供多种遍历方式。
- 元素类型必须是可赋值的(如基本类型、QString、自定义类等)。
- 支持索引访问(如
性能考虑:
- 随机访问:O(1),非常高效。
- 尾部插入/删除:平均O(1),但可能需要重新分配内存。
- 中间插入/删除:O(n),因为需要移动后续元素。
- 查找:O(n),线性查找。
如果需要频繁在中间插入/删除元素,可考虑使用 QLinkedList
;如果需要键值对存储,可使用 QMap
或 QHash
。
1.1 使用
创建和初始化
#include <QList>
#include <QString>// 创建空列表
QList<int> intList;
QList<QString> stringList;// 使用初始化列表创建
QList<int> numbers = {1, 2, 3, 4, 5};
QList<QString> names = {"Alice", "Bob", "Charlie"};// 从现有列表复制
QList<int> copyList(numbers); // 深拷贝// 指定初始大小和值
QList<QString> emptyNames(5, ""); // 创建包含5个空字符串的列表
添加和删除元素
// 添加元素
QList<QString> list;
list.append("Apple"); // 在末尾添加
list.prepend("Banana"); // 在开头添加
list.insert(1, "Cherry"); // 在索引1处插入// 删除元素
list.removeAt(1); // 删除索引1的元素
list.removeFirst(); // 删除第一个元素
list.removeLast(); // 删除最后一个元素
list.removeOne("Apple"); // 删除第一个匹配的元素
list.removeAll("Apple"); // 删除所有匹配的元素// 清空列表
list.clear();
访问和修改元素
// 通过索引访问(不检查边界)
QString first = list[0]; // 读取
list[0] = "New Value"; // 修改// 通过at()访问(检查边界,越界时抛出异常)
QString second = list.at(1);// 获取列表大小
int size = list.size(); // 或 list.count()// 判断列表是否为空
bool isEmpty = list.isEmpty(); // 或 list.size() == 0// 获取第一个和最后一个元素
QString firstItem = list.first(); // 或 list.front()
QString lastItem = list.last(); // 或 list.back()
查找和判断元素
// 查找元素位置(返回第一个匹配的索引,未找到返回-1)
int index = list.indexOf("Apple");
int lastIndex = list.lastIndexOf("Apple");// 判断是否包含元素
bool containsApple = list.contains("Apple");// 统计元素出现次数
int count = list.count("Apple");
遍历列表
基于索引的遍历
for (int i = 0; i < list.size(); ++i) {qDebug() << list[i];
}
基于迭代器的遍历
// 只读迭代器
QList<QString>::const_iterator it;
for (it = list.constBegin(); it != list.constEnd(); ++it) {qDebug() << *it;
}// 读写迭代器
QList<QString>::iterator mutableIt;
for (mutableIt = list.begin(); mutableIt != list.end(); ++mutableIt) {*mutableIt = "Modified";
}
C++11范围for循环
for (const QString &item : list) {qDebug() << item;
}// 可修改的版本
for (QString &item : list) {item = "Modified";
}
排序和筛选
// 排序(升序)
QList<int> numbers = {3, 1, 4, 2};
std::sort(numbers.begin(), numbers.end()); // 标准库排序// 自定义排序(降序)
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {return a > b;
});// 筛选元素(使用STL算法)
QList<int> evenNumbers;
std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(evenNumbers),[](int num) { return num % 2 == 0; });
与其他容器的转换
// QList 转 QVector
QVector<int> vector = numbers.toVector();// QList 转 std::list
std::list<int> stdList = numbers.toStdList();// std::vector 转 QList
std::vector<double> stdVector = {1.1, 2.2, 3.3};
QList<double> qList = QList<double>::fromStdVector(stdVector);
1.2 完整示例
#include <QList>
#include <QDebug>void listExample() {// 创建列表并添加元素QList<QString> fruits;fruits.append("Apple");fruits.append("Banana");fruits.prepend("Cherry");// 遍历列表qDebug() << "所有水果:";for (const QString &fruit : fruits) {qDebug() << fruit;}// 修改元素if (fruits.size() > 1) {fruits[1] = "Blueberry";}// 查找元素int index = fruits.indexOf("Apple");if (index != -1) {qDebug() << "找到Apple,索引为:" << index;}// 删除元素fruits.removeOne("Cherry");// 排序fruits.sort();// 输出排序后的列表qDebug() << "排序后的水果:";for (const QString &fruit : fruits) {qDebug() << fruit;}
}
相关文章:
Qt基础:数据容器类
数据容器类 1. QList1.1 使用创建和初始化添加和删除元素访问和修改元素查找和判断元素遍历列表排序和筛选与其他容器的转换 1.2 完整示例 1. QList 在Qt中,QList 是一个动态数组容器类,用于存储和管理相同类型的元素。它提供了快速随机访问、动态扩展和…...
Vue3监听对象数组属性变化方法
在Vue3中,监听对象数组中某个属性的变化可以通过以下几种方法实现: 方法一:深度监听整个数组并比较属性变化 使用 watch 函数并启用 deep: true,在回调中遍历比较新旧数组的特定属性。 javascript 复制 下载 import { ref, …...

深入了解PyTorch:起源、优势、发展与安装指南
深入了解PyTorch:起源、优势、发展与安装指南 目录 引言PyTorch简介PyTorch的优势 动态计算图直观易用的API强大的社区支持丰富的生态系统高性能与可扩展性 PyTorch的发展历程PyTorch的主要组件 Torch.TensorAutograd自动求导nn模块TorchvisionTorchText和TorchAu…...

DeepSeek智能对话助手项目
目录: 1、效果图2、实现代码3、温度和TopK的作用对比 1、效果图 2、实现代码 # import gradio as gr# def reverse_text(text): # return text[::-1]# demogr.Interface(fnreverse_text,inputs"text",outputs"text")# demo.launch(share&q…...

浅谈Mysql的MVCC机制(RC与RR隔离级别)
MVCC(Multi-Version Concurrency Control)多版本并发控制 说这个我们先来了解一下Mysql的隔离级别,因为MVCC和Mysql的隔离级别是有关的。 Mysql默认的隔离级别是RR(可重复读) 其他的隔离级别是读未提交(…...

uniapp-商城-72-shop(5-商品列表,购物车实现回顾)
我们通过前面的章节已经将数据添加到了购物车,但实际上购物车的处理还有很多东西需要完成。 我们看看如何将商品添加到购物车。 本文介绍了购物车功能的实现方式,重点讲解了如何将商品添加到购物车以及购物车状态管理的处理机制。主要内容包括:1. 通过Vuex管理购物车状态,包…...
【git】 pull + rebase 或 pull + merge什么区别?
在Git中,pull + rebase 和 pull + merge 是两种整合远程分支更新的方式,其核心区别在于如何处理提交历史。以下是详细对比: 核心区别 操作提交历史结构合并方式冲突处理适用场景pull + merge保留分支分叉和合并节点创建新的合并提交(Merge Commit)一次性解决所有冲突公共…...
1. 编程语言进化史与JavaScript
引言 作为一名开发者,理解编程语言的演进历史和核心特性是至关重要的。接下来将从编程语言的三个历史阶段入手,重点解析JavaScript的起源、特性及其与相关技术的关系,同时补充进制转换的基础知识,为初学者构建完整的知识体系。 一、编程语言的三大历史阶段 1. 机器语言(…...
Vue3 中 Axios 深度整合指南:从基础到高级实践引言
在现代前端开发中,与后端API的交互是构建动态应用的核心环节。Axios作为最流行的HTTP客户端之一,以其简洁的API和强大的功能在前端生态中占据重要地位。本文将全面探讨如何在Vue3项目中高效整合Axios,从基础配置到高级封装,从性能…...

MySQL#Select语句执行过程
服务端程序架构 MySQL 是典型的 C/S 架构,即 Client/Server 架构,服务器端程序mysqld。 Select语句执行过程 连接层 客户端和服务器端建立连接,客户端发送 SQL 至服务器端 SQL层 SQL语句处理 查询缓存: 缓存命中该SQL执行结果直…...

hbuilder中h5转为小程序提交发布审核
【注意】 [HBuilder] 11:59:15.179 此应用 DCloud appid 为 __UNI__9F9CC77 ,您不是这个应用的项目成员。1、联系这个应用的所有者,请求加入项目成员(https://dev.dcloud.net.cn "成员管理"-"添加项目成员")…...
文档注释:删还是不删
问题:代码中存在大量的文档注释,占用大量篇幅,一次难以看完整个文件,于是诞生了一个想法:删除所有文档注释,于是问了下 DeepWiki 文档注释对tree - sitter有影响吗?文档注释对Roocode大模型理解…...

【数据结构】单链表练习
1.链表的中间节点 https://leetcode.cn/problems/middle-of-the-linked-list/description/ 用快慢指针来解决 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* middleNode(struct ListNode* he…...
JVM 性能优化终极指南:全版本兼容、参数公式与场景实战
一、引言 JVM 优化的核心难点在于版本兼容性与场景适配性。从 Java 8 到 Java 21,JVM 的内存模型、GC 策略和默认参数发生了巨大变化;从高并发 Web 到大数据批处理,不同业务场景对延迟、吞吐量的要求也截然不同。本文基于历史会话中用户关注…...
分布式爬虫监控架构设计
1. 监控架构核心组件 1.1 日志集中管理 设计目标:聚合所有节点的运行日志,支持实时查询与异常分析。 实现方式: 日志采集:各节点通过 logging 模块将日志发送至中央存储(如Elasticsearch或Redis)。 日志…...
MySQL的参数 innodb_force_recovery 详解
MySQL的参数 innodb_force_recovery 详解 innodb_force_recovery 是 InnoDB 存储引擎的一个重要参数,用于在数据库崩溃恢复时控制恢复行为的级别。这个参数主要在数据库无法正常启动时使用,可以帮助我们从损坏的数据库中恢复数据。 一 参数概述 参数名…...

学习vue3:跨组件通信(provide+inject)
目录 一,关于跨组件通信概述 二,跨组件传值 案例1(爷传孙) 三,跨组件传函数 案例2(爷传孙) 疑问:孙子传给爷爷是否可行呢? 一,关于跨组件通信概述 之前我们学习了父子组件的传…...
Alibaba Sentinel 入门教程:从理论到实战
文章目录 第一部分:理论篇1. Sentinel 简介2. Sentinel 核心原理2.1 资源与规则2.2 Sentinel 工作主流程2.3 核心类解析 3. Sentinel 功能支持与使用流程3.1 流量控制3.2 熔断降级3.3 系统自适应保护3.4 热点参数限流3.5 黑白名单控制3.6 使用流程 4. Sentinel 架构…...
2.3 TypeScript 非空断言操作符(后缀 !)详解
在 TypeScript 中,当你开启了严格的空值检查(strictNullChecks)后,变量如果可能是 null 或 undefined,就必须在使用前进行显式的判断。为了在某些场景下简化代码,TypeScript 提供了非空断言操作符ÿ…...

【菜狗work前端】小程序加if判断时不及时刷新 vs Web
零、前提: 实现input输入数字不大于10000(需要配合typenumber,maxlength5,这里没写) 一、探究代码: <input v-model"model1" input"changeModel1" placeholder"请输入拒收件…...
01 NLP的发展历程和挑战
1.人工智能行业介绍 ANI、AGI、ASI 以下是弱人工智能(ANI)、强人工智能(AGI)和超强人工智能(ASI)的对比表格: 类型定义当前状态弱人工智能(ANI)专注于特定任务&#x…...

TCP 三次握手:详解与原理
无图、长文警告!!!! 文章目录 一、引言二、TCP 三次握手的过程(一)第一次握手:SYN(同步序列号)(二)第二次握手:SYN-ACK(同…...

LabVIEW累加器标签通道
主要展示了 Accumulator Tag 通道的使用,通过三个并行运行的循环模拟不同数值的多个随机序列,分别以不同频率向累加器写入数值,右侧循环每秒读取累加器值,同时可切换查看每秒内每次事件的平均值,用于演示多线程数据交互…...
在 Unity 中,Start 方法直接设置 RectTransform 的位置,时出现问题,与预计位置不匹配。
改动之前的源代码:发现组件的位置,与设计的位置不一样,但是如果把这段代码,交给一个按钮按下回调,就不会出现问题。 void Start(){//初始化Text 行//读取配置文件;StaticDataObj obj Resources.Load<St…...

永磁同步电机控制算法--IP调节器
一、基本原理 在电机控制领域,现今普遍使用的是比例-积分(PI)控制器。然而,PI控制器有一些缺点,可能会在某些应用中产生一些问题,例如:一个非常快的响应,也同时具有过大的超调量。虽然设计PI控制器时,可以…...

Ubuntu 25.04 锁屏不能远程连接的解决方案
最近安装了一个 Ubuntu 25.04,偶然发现可以通过 windows 自带的 rdp 远程工具进行连接,内心狂喜。此外,还支持启动 VNC 协议,也就是默认支持了 rdp 和 vnc 连接。 看了以下,ubuntu 在用户级别下创建了一个远程桌面服务…...

Java 自动装箱和拆箱还有包装类的缓存问题
自动装箱和拆箱就是将基本数据类型和包装类之间进行自动的互相转换。JDK1.5 后, Java 引入了自动装箱(autoboxing)/拆箱(unboxing)。 自动装箱: 基本类型的数据处于需要对象的环境中时,会自动转为“对象”。 我们以 Integer 为例:…...

java-jdk8新特性Stream流
一、Stream流 是专业用于对集合或者数组进行便捷操作的。 1.1 Stream流的创建 主要分为Collection(List与Set)、Map、数组三种创建方式: //1.Collection集合的创建List<String> names new ArrayList<>();Collections.addAll(…...

大语言模型 21 - MCP 自动操作 Figma+Cursor 实现将原型转换为代码
MCP 基本介绍 官方地址: https://modelcontextprotocol.io/introduction “MCP 是一种开放协议,旨在标准化应用程序向大型语言模型(LLM)提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…...

QNAP NEXTCLOUD 域名访问
我是用docker compose方式安装的,虽然不知道是不是这么个叫法,废话不多说。 背景:威联通container station安装了nextcloud和lucky,lucky进行的域名解析和反代 先在想安装的路径、数据存储路径、数据库路径等新建文件夹。再新建…...