【Qt | QList 】QList<T> 容器详细介绍和例子代码

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰: 2024-09-26 09:08:26

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、QList 新增数据
    • ✨2.1 构造函数
    • ✨2.2 在尾部添加数据
    • ✨2.3 在首部添加数据
    • ✨2.4 在指定位置添加数据
  • 🎄三、QList 查询数据
    • ✨3.1 元素个数相关查询
    • ✨3.2 获取元素
    • ✨3.3 查询元素的下标
    • ✨3.4 判断是否包含某个元素
    • ✨3.5 迭代器
  • 🎄四、QList 删除数据
    • ✨4.1 清空数据
    • ✨4.2 删除某个元素
  • 🎄五、QList 修改数据
  • 🎄六、总结


在这里插入图片描述
在这里插入图片描述

🎄一、概述

Qt 提供了一组通用的基千模板的容器类。对比 C丑一的标准模板库中的容器类, Qt 的这些容器更轻量、更安全并且更容易使用。

存储在 Qt 容器中的数据必须是可赋值的数据类型,包括大多数数据类型,如:基本数据类型(如 int 和 double等)和 Qt 的一些数据类型(如 QString 、 QDate 和 QTime 等)。不过, Qt 的 QObject 及其他的子类(如 QWidget 和 Qdialog 等)是不能够存储在容器中的,例如QList<QLineEdit> list;是不允许的。

QList<T>是迄今为止最常用的容器类,它存储给定数据类型 T 的一列数值。下面将从增删改查四个方面来介绍怎么使用QList<T>


在这里插入图片描述

🎄二、QList 新增数据

✨2.1 构造函数

QList()
QList(const QList<T> &other)
QList(QList<T> &&other)
QList(std::initializer_list<T> args)

🌰构造一个QList对象时,需要指定元素类型<T>,下面是一些构造QList的例子:

// 2.1 构造
QList<int> intList;
intList << 1 << 2 << 3 << 4 << 5;
qDebug() << intList;QList<int> intListAdd(intList);
qDebug() << intListAdd;

✨2.2 在尾部添加数据

push_back 是为了兼容C++的STL,它等价于append。

void append(const T &value)
void append(const QList<T> &value)
void push_back(const T &value)
QList<T> operator+(const QList<T> &other) const
QList<T> &operator+=(const QList<T> &other)
QList<T> &operator+=(const T &value)
QList<T> &operator<<(const QList<T> &other)
QList<T> &operator<<(const T &value)

🌰在尾部添加数据时,使用 << 运算符最直观,下面是一些例子:

// 2.2 在尾部添加数据
QList<int> listAddTail;
listAddTail << 5 << 4 << 3 << 2 << 1;
qDebug() << listAddTail;    // (5, 4, 3, 2, 1)listAddTail.append(0);
qDebug() << listAddTail;    // (5, 4, 3, 2, 1, 0)qDebug() << listAddTail + intList;  // (5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5)listAddTail += 6;
qDebug() << listAddTail;    // (5, 4, 3, 2, 1, 0, 6)

✨2.3 在首部添加数据

push_front 是为了兼容C++的STL,它等价于prepend。

void prepend(const T &value)
void push_front(const T &value)

🌰举例子:

// 2.3 在首部添加数据
QList<int> listAddHead;
listAddHead << 1 << 2 << 3 << 4 << 5;listAddHead.prepend(0);
qDebug() << listAddHead;

✨2.4 在指定位置添加数据

void insert(int i, const T &value)
QList::iterator insert(QList::iterator before, const T &value)

🌰举例子:

QList<int> listInsert;
listInsert << 1 << 2 << 3 << 4 << 5;
listInsert.insert(3,3);
qDebug() << listInsert; // (1, 2, 3, 3, 4, 5)QList<int>::iterator itorInsert = listInsert.begin();   // 迭代器指向首个元素
itorInsert++;   // 迭代器移动到第二个元素
listInsert.insert(itorInsert, 2);
qDebug() << listInsert; // (1, 2, 2, 3, 3, 4, 5)

在这里插入图片描述

🎄三、QList 查询数据

✨3.1 元素个数相关查询

empty 函数是为了兼容 C++ 的STL,等价于 isEmpty 。

int count(const T &value) const	// 计算某个元素的个数
int count() const
int length() const
int size() const
bool isEmpty() const
bool empty() const

🌰举例子:

// 3.1 元素个数相关查询
QList<QString> listSize;
listSize << "1" << "2" << "3" << "4" << "5";
qDebug() << "count=" << listSize.count() << ", len=" << listSize.length() << ", size=" << listSize.size();
qDebug() << "count of 3=" << listSize.count("3");
qDebug() << listSize.isEmpty();
listSize.clear();
qDebug() << listSize.empty();

运行结果:
在这里插入图片描述


✨3.2 获取元素

获取单个元素,QList提供了4种策略:

  • 获取指定位置元素
  • 获取第一个元素
  • 获取最后一个元素
  • 从指定位置开始获取指定长度的元素

函数原型如下:

// 获取指定位置元素
const T &at(int i) const
T value(int i) const
T value(int i, const T &defaultValue) const
T &operator[](int i)
const T &operator[](int i) const// 获取第一个元素
T &first()
T &front()
const T &first() const
const T &front() const
const T &constFirst() const// 获取最后一个元素
T &back()
T &last()
const T &last() const
const T &back() const
const T &constLast() const// 从指定位置开始获取指定长度的元素
QList<T> mid(int pos, int length = -1) const

🌰举例子:

QList<QString> listGet;
listGet << "1" << "2" << "3" << "4" << "5";
qDebug() << "at_1=" << listGet.at(1) << ", value_2=" << listGet.value(2) << ", [3]=" << listGet[3];
qDebug() << "fist=" << listGet.first() << ", front=" << listGet.front();
qDebug() << "back=" << listGet.back() << ", last=" << listGet.last();
qDebug() << "mid_2=" << listGet.mid(2) << ", last=" << listGet.mid(3,2);

运行结果:
在这里插入图片描述


✨3.3 查询元素的下标

indexOf:从首部开始查询第一个匹配到的元素的下标;
lastIndexOf:从尾部开始查询第一个匹配到的元素的下标;

int indexOf(const T &value, int from = ...) const
int lastIndexOf(const T &value, int from = ...) const

🌰举例子:

QList<QString> listGetIndex;
listGetIndex << "1" << "2" << "3" << "4" << "1" << "5";
qDebug() << listGetIndex.indexOf("1");		// 0
qDebug() << listGetIndex.lastIndexOf("1");	// 4

✨3.4 判断是否包含某个元素

bool contains(const T &value) const
bool startsWith(const T &value) const
bool endsWith(const T &value) const

🌰举例子:

// 3.4 判断是否包含某个元素
QList<QString> listContains;
listContains << "1" << "2" << "3" << "4" << "5";
qDebug() << listContains.contains("1");     // true
qDebug() << listContains.startsWith("1");   // true
qDebug() << listContains.endsWith("1");     // false

✨3.5 迭代器

查询的时候,很多时候需要用到迭代器,下面是 QList 的迭代器函数原型:

QList::const_iterator begin() const
QList::const_iterator end() const
QList::const_iterator cbegin() const
QList::const_iterator cend() const
QList::const_iterator constBegin() const
QList::const_iterator constEnd() const
QList::const_reverse_iterator crbegin() const
QList::const_reverse_iterator crend() const
QList::const_reverse_iterator rbegin() const
QList::const_reverse_iterator rend() constQList::iterator begin()
QList::iterator end()
QList::reverse_iterator rbegin()
QList::reverse_iterator rend()

🌰举例子:

// 3.5 迭代器
QList<QString> listItorSample;
listItorSample << "1" << "2" << "3" << "4" << "5";
for(QList<QString>::const_iterator itor = listItorSample.constBegin(); itor!=listItorSample.constEnd(); itor++)
{qDebug() << *itor;
}
qDebug(" ");
for(QList<QString>::const_iterator itor = listItorSample.cbegin(); itor!=listItorSample.cend(); itor++)
{qDebug() << *itor;
}
qDebug(" ");
for(QList<QString>::reverse_iterator  itor = listItorSample.rbegin(); itor!=listItorSample.rend(); itor++)
{qDebug() << *itor;
}

运行结果:
在这里插入图片描述


在这里插入图片描述

🎄四、QList 删除数据

✨4.1 清空数据

void clear()

🌰举例子:

// 4.1 清空数据
QList<QString> listCLear;
listCLear << "1" << "2" << "3" << "4" << "5";
qDebug() << listCLear;
listCLear.clear();
qDebug() << listCLear;

运行结果:
在这里插入图片描述


✨4.2 删除某个元素

void removeAt(int i)// 删除指定下标的元素
void removeFirst()	// 删除首个的元素
void removeLast()	// 删除最后一个的元素
int removeAll(const T &value)	// 删除 QList对象中 与指定元素相同的所有元素
bool removeOne(const T &value)	// 删除 QList对象中 与指定元素相同的第一元素
void pop_back()		// 兼容 STL,等价于removeLast
void pop_front()	// 兼容 STL,等价于removeFirst// 删除并获取值,如果不需要获取值,removeAt会更高效
T takeAt(int i)
T takeFirst()
T takeLast()QList::iterator erase(QList::iterator pos)
QList::iterator erase(QList::iterator begin, QList::iterator end)

🌰举例子:

// 4.2 删除元素
QList<QString> listRemove;
listRemove << "1" << "2" << "3" << "4" << "5" << "4" << "3" << "2" << "1";
listRemove.removeAt(1);
qDebug() << listRemove; // ("1", "3", "4", "5", "4", "3", "2", "1")
listRemove.removeFirst();
qDebug() << listRemove; // ("3", "4", "5", "4", "3", "2", "1")
listRemove.removeLast();
qDebug() << listRemove; // ("3", "4", "5", "4", "3", "2")
listRemove.removeAll("4");
qDebug() << listRemove; // ("3", "5", "3", "2")
listRemove.removeOne("3");
qDebug() << listRemove; // ("5", "3", "2")
QList<QString>::iterator itor = listRemove.begin();
listRemove.erase(++itor);
qDebug() << listRemove; // ("5", "2")
qDebug(" ");

在这里插入图片描述

🎄五、QList 修改数据

修改数据的函数不多,一个是移动元素的move,另一个是替换元素的replace,还有就是将 QList 对象转换成其他容器类对象。具体函数原型如下:

void move(int from, int to)			// 移动元素
void replace(int i, const T &value)	// 替换元素
QSet<T> toSet() const			// 转换成 QSet 对象
std::list<T> toStdList() const	// 转换成 std::list 对象
QVector<T> toVector() const		// 转换成 QVector 对象

🌰举例子:

QList<QString> listChange;
listChange << "1" << "2" << "3" << "4" << "5";
listChange.move(2,listChange.size()-1);
qDebug() << listChange;
listChange.replace(2,"3");
qDebug() << listChange;
QVector<QString> vectorChange = listChange.toVector();
qDebug() << vectorChange;

在这里插入图片描述

🎄六、总结

👉本文介绍 Qt 的 QList 是使用总结,从 增、查、删、改 四个方面去翻译Qt文档。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考:
Qt文档
https://blog.csdn.net/u014779536/article/details/111029600

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

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

相关文章

国产化低功耗窄带物联网无线通讯方案_ZETA技术

01 物联网系统中为什么要使用ZETA LPWAN 模组 物联网系统中使用ZETA LPWAN模组的原因主要基于以下几个方面&#xff1a; 1、技术优势 低功耗广域网&#xff08;LPWAN&#xff09;特性&#xff1a;ZETA技术是一种基于UNB的低功耗广域网技术协议标准&#xff0c;具有覆盖范围广…

从 Kafka 到 WarpStream: 用 MinIO 简化数据流

虽然 Apache Kafka 长期以来一直是流数据的行业标准&#xff0c;但新的创新替代方案正在重塑生态系统。其中之一是 WarpStream&#xff0c;它最近在 Confluent 的所有权下进入了新的篇章。此次收购进一步增强了 WarpStream 提供高性能、云原生数据流的能力&#xff0c;巩固了其…

【IOS】申请开发者账号(公司)

官网&#xff1a;Apple Developer (简体中文) 申请开发者账号前提 如果是第一次申请建议注册一个新的apple id作为组织的开发者账号。&#xff08;确保apple id的个人信息是真实的&#xff0c;不能是网名或者是其他名。后续的申请步骤需要能和apple id的个人信息对上。&#…

Navicat数据库管理工具实现Excel、CSV文件导入到MySQL数据库

1.所需要的工具和环境 navicat等第三方数据库管理工具云服务器中安装了 1Panel面板搭建的mysql数据库 2.基于 1Panel启动mysql容器 2.1 环境要求 安装前请确保您的系统符合安装条件&#xff1a; 操作系统&#xff1a;支持主流 Linux 发行版本&#xff08;基于 Debian / Re…

“类型名称”在Go语言规范中的演变

Go语言规范&#xff08;The Go Programming Language Specification&#xff09;[1]是Go语言的核心文档&#xff0c;定义了该语言的语法、类型系统和运行时行为。Go语言规范的存在使得开发者在实现Go编译器时可以依赖一致的标准&#xff0c;它确保了语言的稳定性和一致性&#…

c++----继承(初阶)

大家好呀&#xff0c;今天我们也是多久没有更新博客了&#xff0c;今天来讲讲我们c加加中的一个比较重要的知识点继承。首先关于继承呢&#xff0c;大家从字面意思看&#xff0c;是不是像我们平常日常生活中很容易出现的&#xff0c;比如说电视剧里面什么富豪啊&#xff0c;去了…

万魔头戴式耳机好用吗?万魔、西圣、索尼头戴式耳机决赛圈测评

现在耳机市场已经有各种不同类型的耳机&#xff0c;对于有降噪需求的人来说&#xff0c;头戴式耳机是一个不错的选择。那么对于后台有人私信说想知道万魔头戴式耳机好用吗&#xff1f;为了解答这个疑问&#xff0c;今天我就为大家评测西圣H1、万魔SonoFlow和索尼WH-CH520这三款…

【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器

文章目录 C list 容器详解&#xff1a;从入门到精通前言第一章&#xff1a;C list 容器简介1.1 C STL 容器概述1.2 list 的特点 第二章&#xff1a;list 的构造方法2.1 常见构造函数2.1.1 示例&#xff1a;不同构造方法2.1.2 相关文档 第三章&#xff1a;list 迭代器的使用3.1 …

【Linux】Linux 的 权限

一、 Linux 权限的概念 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以在 linux 系统下做任何事情&#xff0c;不受限制普通用户&#xff1a;在 linux 下做有限的事情。超级用户的命令提示符是“#”&#xff0c;普…

初学51单片机之I2C总线与E2PROM

首先先推荐B站的I2C相关的视频I2C入门第一节-I2C的基本工作原理_哔哩哔哩_bilibili 看完视频估计就大概知道怎么操作I2C了&#xff0c;他的LCD1602讲的也很不错&#xff0c;把数据建立tsp和数据保持thd&#xff0c;比喻成拍照时候的摆pose和按快门两个过程&#xff0c;感觉还是…

Mysql之索引优化

指定索引 当一个字段上既有单列索引&#xff0c;又有复合索引时&#xff0c;我们可以通过以下的SQL提示来要求该SQL语句执行时采用哪个索引&#xff1a; use index(索引名称)&#xff1a;建议使用该索引&#xff0c;只是建议&#xff0c;底层mysql会根据实际效率来考虑是否使用…

使用豆包MarsCode 实现高可用扫描工具

以下是「 豆包MarsCode 体验官」优秀文章&#xff0c;作者郝同学测开笔记。 前言&#xfeff; 最近接触K8s&#xff0c;了解到K8s提供了非常方便的实现高可用的能力&#xff0c;再加上掘金推出「豆包MarsCode初体验」征文活动&#xff0c;所以打算使用豆包 MarsCode IDE来实现…

LeetCode(Python)-贪心算法

文章目录 买卖股票的最佳时机问题穷举解法贪心解法 物流站的选址&#xff08;一&#xff09;穷举算法贪心算法 物流站的选址&#xff08;二&#xff09;回合制游戏快速包装 买卖股票的最佳时机问题 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。如果你…

Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动

文章目录 1、 buildroot源码获取2、buildroot配置3、buildroot编译4、挂载根文件系统 在上一篇 Qemu开发ARM篇-4、kernel交叉编译运行演示中&#xff0c;我们编译了kernel&#xff0c;并在qemu上进行了运行&#xff0c;但到最后&#xff0c;在挂载根文件系统时候&#xff0c;挂…

python之装饰器、迭代器、生成器

装饰器 什么是装饰器&#xff1f; 用来装饰其他函数&#xff0c;即为其他函数添加特定功能的函数。 装饰器的两个基本原则&#xff1a; 装饰器不能修改被装饰函数的源码 装饰器不能修改被装饰函数的调用方式 什么是可迭代对象&#xff1f; 在python的任意对象中&#xff…

C# DotNetty客户端

1. 引入DotNetty包 我用的开发工具是VS2022&#xff0c;不同工具引入可能会有差异 工具——>NuGet包管理器——>管理解决方案的NuGet程序包 搜索DotNetty 2.新建EchoClientHandler.cs类 用于接收服务器返回数据 public class EchoClientHandler : SimpleChannelIn…

【AD那些事 10 】焊盘如何修改为自己想要的形状!!!!! 焊盘设计规则如何更改??????

左侧为修改前焊盘原图 右侧为修改后焊盘图 ——————————————————————————————————————————— 目录 修改焊盘内侧的大小 修改焊盘外侧的大小 更改焊盘设计规则 ——————————————————————————…

Pencils Protocol 即将登录各大 CEX,依旧看好 $DAPP

近期&#xff0c;Scroll生态头部DeFi协议Pencils Protocol迎来了系列重磅市场进展。自9月18日开始&#xff0c;$DAPP通证分别在Tonkensoft、Bounce以及Coresky等平台陆续开启了IDO&#xff0c;并且在短期内售罄。同时在通证售卖完成后&#xff0c;DAPP 通证又在9月27日陆续登录…

RUST语言的初印象-从一个模拟登陆谈起-slint+reqwest+aes

本文就一个做了三四天的小程序讲第一次学用RUST的感受&#xff0c;内附代码。 了角语言 从一些渠道听说了R&#xff0c;这个字母挺魔性&#xff0c;那个文章说C和R的团体已经上升到了宗教崇拜的高度&#xff0c;然后&#xff0c;我觉得必 有过人之处&#xff0c;大约10年没碰…

通用运维基础

一 网络基础 知识点:网络交换1.1 VLAN1.2VxLAN2.网络路由3.网络常用命令目标:1. 了解网络的基本概念 2. 掌握常用的网络排错命令 1、网络交换 1.1 网络虚拟化 什么是网络虚拟化 网络虚拟化是指虚拟网络节点之间的连接并不使用物理线缆连接,而是依靠特定的虚拟化链路相连…