QT-【常用容器类】-QList类 QLinkedList类

QListQLinkedList 是 Qt 框架中提供的两个重要容器类,用于存储和管理一组数据。它们各自具有不同的特点和优缺点,适用于不同的场景。


1. QList 类概述

QList 是一个动态数组类,提供了对元素的快速随机访问。它的实现类似于 C++ 标准库中的 std::vector。通过 QList,开发者可以方便地管理一组相同类型的元素。

1.1 QList 的特性

  • 动态数组QList 可以自动扩展以容纳更多元素,适合用于大小不确定的列表。
  • 随机访问:支持快速的随机访问操作,时间复杂度为 O(1),适合频繁访问的场景。
  • 内存管理QList 使用引用计数来管理元素的内存,这意味着在列表中存储的对象将自动释放。
  • 支持复制QList 支持值语义和引用语义,可以安全地复制和传递。

1.2 QList 的基本用法

以下是 QList 的基本用法示例,包括创建、插入、删除和遍历元素。

cpp

#include <QList>
#include <QString>
#include <QDebug>int main() {// 创建 QListQList<QString> list;// 添加元素list.append("Hello"); // 在末尾添加 "Hello"list.append("World"); // 在末尾添加 "World"// 插入元素list.insert(1, "Qt"); // 在索引 1 处插入 "Qt"// 访问元素qDebug() << list[0]; // 输出 "Hello"qDebug() << list.at(1); // 输出 "Qt"// 遍历元素for (const QString& str : list) {qDebug() << str; // 输出每个元素}// 删除元素list.removeAt(1); // 删除索引 1 的元素// 清空列表list.clear(); // 清空列表return 0;
}

1.3 QList 的常用方法

  • append(const T &value):在列表末尾添加一个元素。
  • insert(int i, const T &value):在指定索引处插入一个元素。
  • removeAt(int i):删除指定索引处的元素。
  • clear():清空列表,移除所有元素。
  • size():返回列表中的元素数量。
  • isEmpty():检查列表是否为空,返回布尔值。
  • indexOf(const T &value):查找元素并返回其索引,如果不存在则返回 -1。
  • contains(const T &value):检查列表是否包含某个元素。

1.4 QList 的性能分析

  • 插入和删除:在列表末尾插入或删除元素的时间复杂度是 O(1),在中间插入或删除的时间复杂度为 O(n),因为需要移动后续的元素。
  • 访问:访问元素的时间复杂度为 O(1),适合需要频繁随机访问的场景。
  • 内存使用QList 在内存使用上相对高效,但在进行大量插入和删除操作时,可能会导致频繁的内存重新分配。

2. QLinkedList 类概述

QLinkedList 是一个双向链表类,允许在列表的两端和中间位置进行快速插入和删除操作。其设计适合于需要频繁修改元素的场景。

2.1 QLinkedList 的特性

  • 双向链表:每个节点包含指向前一个和后一个节点的指针,允许双向遍历。
  • 插入和删除性能:在链表中间插入和删除的操作时间复杂度为 O(1),适合频繁修改的场景。
  • 不支持随机访问:访问列表元素的时间复杂度为 O(n),不适合需要频繁随机访问的场景。
  • 内存管理:同样使用引用计数来管理元素的内存。

2.2 QLinkedList 的基本用法

以下是 QLinkedList 的基本用法示例,包括创建、插入、删除和遍历元素。

cpp

#include <QLinkedList>
#include <QString>
#include <QDebug>int main() {// 创建 QLinkedListQLinkedList<QString> linkedList;// 添加元素linkedList.append("Hello"); // 添加 "Hello"linkedList.append("World"); // 添加 "World"// 在头部插入元素linkedList.prepend("Qt"); // 在开头添加 "Qt"// 访问元素qDebug() << linkedList.first(); // 输出 "Qt"qDebug() << linkedList.last(); // 输出 "World"// 遍历元素for (const QString& str : linkedList) {qDebug() << str; // 输出每个元素}// 删除元素linkedList.removeFirst(); // 删除第一个元素linkedList.removeLast(); // 删除最后一个元素// 清空列表linkedList.clear(); // 清空链表return 0;
}

2.3 QLinkedList 的常用方法

  • append(const T &value):在链表末尾添加一个元素。
  • prepend(const T &value):在链表开头添加一个元素。
  • removeFirst():删除链表的第一个元素。
  • removeLast():删除链表的最后一个元素。
  • first():返回链表的第一个元素。
  • last():返回链表的最后一个元素。
  • size():返回链表中的元素数量。
  • isEmpty():检查链表是否为空,返回布尔值。

2.4 QLinkedList 的性能分析

  • 插入和删除:在链表的头部或尾部插入和删除的时间复杂度为 O(1),在链表中间插入或删除的时间复杂度也是 O(1),前提是你已经获得了该位置的迭代器。
  • 访问:访问元素的时间复杂度为 O(n),因此不适合频繁随机访问的场景。
  • 内存使用:由于每个节点都需要存储两个指针,QLinkedList 在内存占用上可能比 QList 更高,但在进行大量插入和删除操作时,QLinkedList 更加高效。

3. QList 和 QLinkedList 的比较

3.1 使用场景

  • QList

    • 适合需要频繁随机访问的场景,如查找、排序等操作。
    • 数据量不大且插入和删除操作不频繁时,QList 是一个理想选择。
  • QLinkedList

    • 适合需要频繁插入和删除操作的场景,特别是在中间位置。
    • 不需要随机访问时,可以使用 QLinkedList 来节省内存和提高性能。

3.2 优缺点总结

特性QListQLinkedList
存储方式动态数组双向链表
随机访问快速(O(1))慢(O(n))
插入/删除性能尾部 O(1),中间 O(n)头尾 O(1),中间 O(1)(需迭代器)
内存使用相对高效较高(每个节点需额外存储指针)
适用场景随机访问频繁,修改少插入删除频繁,随机访问少

4. 实际使用中的注意事项

在使用 QListQLinkedList 时,有一些注意事项可以帮助你更有效地利用这些容器:

  1. 选择合适的容器:根据具体需求选择 QListQLinkedList。如果频繁访问元素,选择 QList;如果频繁插入和删除元素,选择 QLinkedList

  2. 内存管理:虽然 Qt 的容器类会自动管理内存,但在使用自定义对象时,确保这些对象的析构函数正确实现,以避免内存泄漏。

  3. 避免不必要的复制:在需要传递 QListQLinkedList 给函数时,尽量使用引用(const QList<T>&const QLinkedList<T>&)来避免不必要的复制开销。

  4. 迭代器使用:在 QLinkedList 中频繁插入和删除时,使用迭代器可以提高效率。获取迭代器后,可以在 O(1) 的时间复杂度内进行插入和删除。

  5. 性能分析:在性能敏感的应用程序中,建议进行基准测试,以确定在特定情况下哪种容器表现更好。

5. 结论

QListQLinkedList 是 Qt 框架中非常重要的容器类,各自具有不同的优缺点和适用场景。QList 适合于需要频繁随机访问的情况,而 QLinkedList 更适合于频繁插入和删除的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java包装类型的缓存

Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。 Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128&#xff0c;127] 的相应类型的缓存数据&#xff0c;Character 创建了数值在 [0,127] 范围的缓存数据&#xff0c;Boolean 直接返回 True or Fal…

施耐德变频器ATV320系列技术优势:创新与安全并重

在工业自动化领域&#xff0c;追求高效、安全与智能已成为不可阻挡的趋势。施耐德变频器ATV320系列凭借其强大的设计标准和全球认证&#xff0c;成为能够帮助企业降低安装成本&#xff0c;提高设备性能的创新解决方案。 【全球认证&#xff0c;品质保障】ATV320 系列秉持施耐德…

Excel批量设置行高,Excel表格设置自动换行后打印显示不全,Excel表格设置最合适的行高后打印显示不全,完美解决方案!!!

文章目录 说个问题&#xff08;很严重&#xff01;&#xff01;&#xff01;&#xff09;写个方案会Python看这里Python环境搭建不存在多行合并存在多行合并 不会Python看这里 说个问题&#xff08;很严重&#xff01;&#xff01;&#xff01;&#xff09; 平时处理Excel表格…

洛谷 P1014:Cantor 表

【题目来源】https://www.luogu.com.cn/problem/P1014https://www.acwing.com/problem/content/5510/【题目描述】 现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。 他是用下面这一张表来证明这一命题的&#xff1a; 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 …

C语言基础:指针(数组指针与指针数组)

数组指针与指针数组 数组指针 概念&#xff1a;数组指针是指向数组的指针&#xff0c;本质上还是指针 特点&#xff1a; 先有数组&#xff0c;后有指针 它指向的是一个完整的数组 一维数组指针&#xff1a; 语法&#xff1a; 数据类型 (*指针变量名)[行容量][列容量]; 案…

华为管理变革之道:奋斗文化与活力

目录 企业文化是什么&#xff1f; 为什么活下去是华为的文化&#xff1f; 活下来&#xff0c;是华为公司的最低纲领&#xff0c;也是华为公司的最高纲领&#xff01; 资源终会枯竭&#xff0c;唯有文化才能生生不息 企业文化之一&#xff1a;以客户为中心 企业文化之二&a…

JS面试题|[2024-12-26]

1.事件委托是什么 又叫事件代理&#xff0c;原理就是直接利用了事件冒泡的机制来实现&#xff0c;也就是说把子元素的事件绑定到了父元素的身上&#xff0c;如果子元素阻止了事件冒泡&#xff0c;那么委托也就不成立了。 阻止事件冒泡&#xff1a;event.stopPropagation() addE…

upload-labs关卡记录12

直接上传一句话木马&#xff0c;发现提示&#xff1a; 很明显这是一个白名单&#xff0c;而且不是前端的js检查&#xff0c;而是服务端的检查&#xff0c;因此我们使用bp抓包&#xff0c;改一下文件类型试试&#xff1a; 找到包之后&#xff0c;我们对content-type进行一个更改…

ArkTs组件(2)

一.下拉列表组件&#xff1a;Select 1.接口 Select(options: Array<SelectOption>) 参数名类型必填说明optionsArray<SelectOption>是设置下拉选项。 SelectOption对象说明 名称类型必填说明valueResourceStr是 下拉选项内容。 iconResourceStr否 下拉选项图片…

J9学习打卡笔记

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 IInception v3算法实战 网络结构InceptionAInceptionBInceptionCReductionAReductionB辅助分支个人总结 import os, PIL, random, pathlib import torch impor…

软考和 PMP 哪个含金量更高点?

软考高项比较适用于计算机 IT 行业&#xff0c;而 PMP 不受行业限制&#xff0c;各行各业都适用&#xff0c;没有哪个含金量更高的说法 至于哪个更合适&#xff0c;看你想去国企还是民企&#xff0c;国企软考吃香&#xff0c;外企PMP 吃香 下面说下两者具体有什么区别&#x…

面向微服务的Spring Cloud Gateway的集成解决方案:用户登录认证与访问控制

&#x1f3af;导读&#xff1a;本文档详细描述了一个基于Spring Cloud Gateway的微服务网关及Admin服务的实现。网关通过定义路由规则&#xff0c;利用负载均衡将请求转发至不同的后端服务&#xff0c;并集成了Token验证过滤器以确保API的安全访问&#xff0c;同时支持白名单路…

NLP 中文拼写检测纠正论文 C-LLM Learn to CSC Errors Character by Character

拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法&#xff0c;如果提升 100W 倍的性能&#xff1f; NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正&#xff1f;可我只会写 CRUD 啊&#xff01; 一个提升英文单词拼…

kong网关使用pre-function插件,改写接口的返回数据

一、背景 kong作为api网关&#xff0c;除了反向代理后端服务外&#xff0c;还可对接口进行预处理。 比如本文提及的一个小功能&#xff0c;根据http header某个字段的值&#xff0c;等于多少的时候&#xff0c;返回一个固定的报文。 使用到的kong插件是pre-function。 除了上…

Linux:进程概念

1.冯诺依曼体系结构 结论&#xff1a; --- CPU不和外设直接打交道&#xff0c;和内存直接打交道。 --- 所有的外设&#xff0c;有数据需要收入&#xff0c;只能载入到内存中&#xff1b;内存写出&#xff0c;也一定是写道外设中。 --- 为什么程序要运行必须加载到内存&#xf…

结构体(初阶)

结构体&#xff1a; 结构体类型的声明 结构体初始化 结构成员访问 结构体传参 1.结构体的声明 1.1结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2结构的声明 struct tag { member - list; }variable-lis…

设计模式的主要分类是什么?请简要介绍每个分类的特点。

大家好&#xff0c;我是锋哥。今天分享关于【设计模式的主要分类是什么&#xff1f;请简要介绍每个分类的特点。】面试题。希望对大家有帮助&#xff1b; 设计模式的主要分类是什么&#xff1f;请简要介绍每个分类的特点。 1000道 互联网大厂Java工程师 精选面试题-Java资源分…

显示 Windows 任务栏

显示 Windows 任务栏 1. 取消勾选自动隐藏任务栏2. 重启 Windows 资源管理器References 1. 取消勾选自动隐藏任务栏 Windows 任务栏具有自动隐藏功能&#xff0c;不使用时自动隐藏&#xff0c;使用时显示。 鼠标右键单击桌面上的空白区域&#xff0c;个性化 -> 任务栏。不…

c# RSA加解密工具,.netRSA加解密工具

软件介绍 名称: c# RSA加解密工具,.netRSA加解密工具依赖.net版本: .net 8.0工具类型: WinForm源码下载 c# RSA加解密工具,.netRSA加解密工具 依赖项 WinFormsRSA.csproj <Project

STM32-笔记17-PWM波型

一、介绍 PWM波形&#xff08;Pulse Width Modulation&#xff0c;脉冲宽度调制波形&#xff09;是一种占空比可变的脉冲波形。这种调制方式通过改变脉冲的宽度来控制电路中的信号强度和频率。具体来说&#xff0c;PWM波形中的高电平持续时间和低电平持续时间可以根据需要进行调…