Qt基础:数据容器类

news2025/12/14 19:42:24

数据容器类

  • 1. QList
    • 1.1 使用
      • 创建和初始化
      • 添加和删除元素
      • 访问和修改元素
      • 查找和判断元素
      • 遍历列表
      • 排序和筛选
      • 与其他容器的转换
    • 1.2 完整示例

1. QList

在Qt中,QList 是一个动态数组容器类,用于存储和管理相同类型的元素。它提供了快速随机访问、动态扩展和丰富的操作方法,是Qt中最常用的容器类之一。

  • 功能:实现动态数组,支持快速随机访问和动态增长。
  • 底层实现:基于数组,在元素数量超过预分配空间时自动重新分配内存。
  • 特点
    • 支持索引访问(如 list[0])。
    • 可动态添加、删除元素。
    • 提供多种遍历方式。
    • 元素类型必须是可赋值的(如基本类型、QString、自定义类等)。

性能考虑:

  • 随机访问:O(1),非常高效。
  • 尾部插入/删除:平均O(1),但可能需要重新分配内存。
  • 中间插入/删除:O(n),因为需要移动后续元素。
  • 查找:O(n),线性查找。

如果需要频繁在中间插入/删除元素,可考虑使用 QLinkedList;如果需要键值对存储,可使用 QMapQHash

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;
    }
}

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

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

相关文章

深入了解PyTorch:起源、优势、发展与安装指南

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

DeepSeek智能对话助手项目

目录&#xff1a; 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&#xff08;Multi-Version Concurrency Control&#xff09;多版本并发控制 说这个我们先来了解一下Mysql的隔离级别&#xff0c;因为MVCC和Mysql的隔离级别是有关的。 Mysql默认的隔离级别是RR&#xff08;可重复读&#xff09; 其他的隔离级别是读未提交&#xff08;…

uniapp-商城-72-shop(5-商品列表,购物车实现回顾)

我们通过前面的章节已经将数据添加到了购物车,但实际上购物车的处理还有很多东西需要完成。 我们看看如何将商品添加到购物车。 本文介绍了购物车功能的实现方式,重点讲解了如何将商品添加到购物车以及购物车状态管理的处理机制。主要内容包括:1. 通过Vuex管理购物车状态,包…

MySQL#Select语句执行过程

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

hbuilder中h5转为小程序提交发布审核

【注意】 [HBuilder] 11:59:15.179 此应用 DCloud appid 为 __UNI__9F9CC77 &#xff0c;您不是这个应用的项目成员。1、联系这个应用的所有者&#xff0c;请求加入项目成员&#xff08;https://dev.dcloud.net.cn "成员管理"-"添加项目成员"&#xff09;…

【数据结构】单链表练习

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…

学习vue3:跨组件通信(provide+inject)

目录 一&#xff0c;关于跨组件通信概述 二&#xff0c;跨组件传值 案例1(爷传孙&#xff09; 三&#xff0c;跨组件传函数 案例2(爷传孙&#xff09; 疑问&#xff1a;孙子传给爷爷是否可行呢&#xff1f; 一&#xff0c;关于跨组件通信概述 之前我们学习了父子组件的传…

【菜狗work前端】小程序加if判断时不及时刷新 vs Web

零、前提&#xff1a; 实现input输入数字不大于10000&#xff08;需要配合typenumber&#xff0c;maxlength5&#xff0c;这里没写&#xff09; 一、探究代码&#xff1a; <input v-model"model1" input"changeModel1" placeholder"请输入拒收件…

TCP 三次握手:详解与原理

无图、长文警告&#xff01;&#xff01;&#xff01;&#xff01; 文章目录 一、引言二、TCP 三次握手的过程&#xff08;一&#xff09;第一次握手&#xff1a;SYN&#xff08;同步序列号&#xff09;&#xff08;二&#xff09;第二次握手&#xff1a;SYN-ACK&#xff08;同…

LabVIEW累加器标签通道

主要展示了 Accumulator Tag 通道的使用&#xff0c;通过三个并行运行的循环模拟不同数值的多个随机序列&#xff0c;分别以不同频率向累加器写入数值&#xff0c;右侧循环每秒读取累加器值&#xff0c;同时可切换查看每秒内每次事件的平均值&#xff0c;用于演示多线程数据交互…

永磁同步电机控制算法--IP调节器

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

Ubuntu 25.04 锁屏不能远程连接的解决方案

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

Java 自动装箱和拆箱还有包装类的缓存问题

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

java-jdk8新特性Stream流

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

大语言模型 21 - MCP 自动操作 Figma+Cursor 实现将原型转换为代码

MCP 基本介绍 官方地址&#xff1a; https://modelcontextprotocol.io/introduction “MCP 是一种开放协议&#xff0c;旨在标准化应用程序向大型语言模型&#xff08;LLM&#xff09;提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…

QNAP NEXTCLOUD 域名访问

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

华为OD机试真题——信道分配(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

比亚迪“双剑”电池获中汽中心权威认证,堪称“移动安全堡垒”。

在新能源汽车发展中&#xff0c;电池安全是重中之重。比亚迪的刀片电池与闪充刀片电池提前通过电池新国标全项检测&#xff0c;获中汽中心权威认证&#xff0c;堪称“移动安全堡垒”。 传统电池极端条件下易热失控&#xff0c;而刀片电池独特长条形设计&#xff0c;似刀片般&am…

【mysql】mysql的高级函数、高级用法

mysql是最常用的数据库之一&#xff0c;常见的函数用法大家应该都很熟悉&#xff0c;本文主要例举一些相对出现频率比较少的高级用法 (注&#xff1a;需注意mysql版本&#xff0c;大部分高级特性都是mysql8才有的) 多值索引与虚拟列 主要是解决字符串索引问题&#xff0c;光说…