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.mzph.cn/diannao/65491.shtml

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

相关文章

SQLAlchemy示例(连接数据库插入表数据)

背景需求 连接数据库&#xff0c;插入表中一些数据。 其用户是新建用户&#xff0c;所以只能插入&#xff0c;不能更新。 再次输入数据则使用更新数据语法&#xff0c;这个没调试。 #! /usr/bin/env python # -*- coding: utf-8 -*-from sqlalchemy import create_engine, …

低代码开发中 DDD 领域驱动的页面权限控制

在低代码开发的领域中&#xff0c;应用安全与灵活性是两大关键考量因素。领域驱动设计&#xff08;DDD&#xff09;作为一种在软件设计领域广泛应用且颇具影响力的方法论&#xff0c;正逐渐在低代码开发的页面权限控制方面展现出其独特的价值与潜力。本文旨在客观地探讨如何借助…

找到一个linux静态库动态库的好资料.3

# 正文 继续整理从这个页面学到的东西&#xff1a;https://tldp.org/HOWTO/Program-Library-HOWTO。 之前的在这里&#xff1a;找到一个linux静态库动态库的好资料.0找到一个linux静态库动态库的好资料.1找到一个linux静态库动态库的好资料.2 这一篇继续看这个: https://tldp…

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之6

本文提要 一些补充 在为前端和后端 锁定的两个中心词“概念”&#xff08;命题“作文”的 程序 公共逻辑语言 &#xff09;和“描述”&#xff08;谓词“描述” 的 自然 描述语言&#xff09;的基础上 &#xff0c;暂时将中端的中心词 锁定在“环境” &#xff08;情境 “意义…

uniapp小程序实现弹幕不重叠

uniapp小程序实现弹幕不重叠 1、在父组件中引入弹幕组件 <template><!-- 弹幕 --><barrage ref"barrage" class"barrage-content" reloadDanmu"reloadDanmu"></barrage> </template> <script>import barr…

区块链平台安全属性解释

区块链平台安全属性解释 双向认证 解释:双向认证是指在通信过程中,**通信双方都需要对对方的身份进行验证,确保对方是合法的、可信任的实体。**只有双方身份都得到确认后,通信才会被允许进行,从而防止非法用户的接入和数据的窃取或篡改。举例:在基于区块链和联邦学习的数…

nginx 基于 geoip 模块限制地区访问

1、安装 geoip 库 [rootVM-0-15-centos ~]# yum -y install geoip geoip-devel 2、下载并安装 MaxMind 的免费 GeoIP 数据库。这里我选择下载 GeoLite2 数据库&#xff0c;适用于大多数应用。 访问 maxmind 官网&#xff08;https://www.maxmind.com/&#xff09;&#xff0c…

openfeign-一些配置

之前整理过一篇 openfeign的快速使用。openfeign简化服务间调用-笔记-CSDN博客 今天补充一下一些个性化配置。 一 日志&#xff1a; 默认的openfeign不输出日志&#xff0c;想看日志需要单独配置下。 日志级别 public static enum Level {NONE,BASIC,HEADERS,FULL;private…

【回溯】LeetCode经典题目总结:组合、排列、子集、分割、N皇后、单词搜索

回溯 组合问题组合总和全排列子集分割回文串N皇后电话号码的字母组合单词搜索括号生成 组合问题 给定两个整数 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 树形结构&#xff1…

HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?

在 iPhone 拍摄照片时&#xff0c;默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点&#xff0c;但在某些设备或软件上可能存在兼容性问题。因此&#xff0c;将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂&#xf…

【实战示例】面向对象的需求建模

前言 博主准备写一个以面向对象为核心思想的软件需求建模、领域建模的系列&#xff0c;总结一整套可落地的DDD的打法&#xff0c;前面几篇文章论述了如何进行面向对象的需求建模&#xff0c;本文将以一个简单的购物商城的需求来演示如何进行面向对象的需求建模。 面向对象的需…

04-微服务02

我们将黑马商城拆分为5个微服务&#xff1a; 用户服务 商品服务 购物车服务 交易服务 支付服务 由于每个微服务都有不同的地址或端口&#xff0c;相信大家在与前端联调的时候发现了一些问题&#xff1a; 请求不同数据时要访问不同的入口&#xff0c;需要维护多个入口地址…

【MyBatis 核心工作机制】注解式开发与动态代理原理

有很多朋友可能已经在开发中熟练使用 MyBatis 或者刚开始学习 MyBatis&#xff0c;对于它的一些工作机制不太了解。“咦&#xff0c;怎么写几个注解&#xff0c;写几个配置文件&#xff0c;就能实现这些效果呢&#xff0c;好神奇呀&#xff01;”当你看完这篇博客之后&#xf…

Node.js 工具:在 Windows 11 中配置 Node.js 的详细步骤

一、概述 记录时间 [2024-12-25] 本文讲述如何在 Windows 11 中进行 Node.js 工具的安装和配置。 以下是详细的步骤和说明。 二、安装 Node.js 1. 官网下载 通过官网&#xff0c;下载 Node.js&#xff0c;上面有好几种下载方式&#xff0c;文中下载的是 zip 压缩包。 如图&…

Element-plus自动导入

安装 npm i element-plus 自动引入 1. 安装两个插件 npm install -D unplugin-vue-components unplugin-auto-import2. 配置插件 vue3项目修改vite.config.js&#xff0c;把两个插件添加入即可&#xff0c;注意:不是覆盖原有配置 Vite // vite.config.js import { define…

大模型:OneFitsAll、Time - LLM、LLaTA

LLM数据集:ETT、Illness、Weather ETT、Illness、Weather在上述提到的论文中都是用于时间序列预测研究的真实世界数据集,以下是对它们的具体介绍: ETT数据集 内容:ETT是电力变压器温度(Electric Transformer Temperature)数据集,通常包含电力变压器在不同时间点的温度…

Ardunio BLE keyboard 库的使用

为了开发一个 ardunio 的蓝牙选歌器&#xff0c;网络上普遍推荐使用&#xff1a; https://github.com/T-vK/ESP32-BLE-Keyboard 结果搞了好几天&#xff0c;就是不行。最后发现&#xff0c;下面两点非常重要&#xff1a; 使用 NimBle-ardunio 库这个库目前是2.1.2 &#xff…

客户案例:基于慧集通平台集成打通小满CRM+金蝶云星空+钉钉

一、引言 本案例原型公司是一家生物科技公司&#xff0c;公司自开创以来专注于体外诊断生物活性原材料的研究、生产、销售和服务&#xff0c;致力于为全球体外诊断试剂生产企业提供领先且具有竞争力的核心原料和相关辅助产品服务。公司以卓越的产品和优质的服务赢得了客户的广…

基于FISCO BCOS的电子签章系统

概述 本项目致力于构建一个安全、高效且功能完备的电子印章系统&#xff0c;通过整合区块链技术与传统数据库管理&#xff0c;为用户提供了可靠的电子签章解决方案&#xff0c;有效应对传统电子签章系统的数据安全隐患&#xff0c;满足企业和个人在数字化办公环境下对电子文档…

【2025最新计算机毕业设计】基于SpringBoot+Vue在线考试系统(源码包运行)【提供源码+答辩PPT+文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…