【QT】容器类

本文详细介绍了Qt中的几种容器类,包括顺序容器QList、QLinkedList、QVector、QStack和QQueue,以及关联容器QSet和QMap。QList和QLinkedList都是动态大小的,QLinkedList提供双向遍历,QVector提供高效访问。QStack和QQueue分别实现了后入先出和先入先出的特性。QSet基于散列表,提供快速查找,QMap和QMultiMap提供键值对存储,QMultiMap允许多个值对应一个键。
摘要由CSDN通过智能技术生成

目录

1.容器类概述

2.顺序容器类

2.1 QList

2.2 QLinkedList

2.3 QVector

2.4 QStack

2.5 QQueue

3.关联容器类

3.1 QSet

3.2 QMap

3.3 QMultiMap

3.4 QHash

3.5 QMuItiHash

1.容器类概述

  • Qt提供了多个基于模板的容器类,这些容器类可以用于存储指定类型的数据项。
  • Qt的容器类比标准模板库(STL)中的容器类更轻巧、安全和易于使用。这些容器类是隐式共享和可重入的,而且它们进行了速度和存储优化,因此可以减少可执行文件的大小。此外,它们还是线程安全的,也就是说它们作为只读容器时可被多个线程访问。
  • Qt的容器类分为顺序容器(sequentialcontainers)和关联容器(associativecontainers)。
  • 容器迭代类用于遍历容器里的数据项,有Java类型的迭代类和STL类型的迭代类。Java类型的迭代类易于使用,提供高级功能,而STL类型的迭代类效率更高一些。Qt还提供了foreach宏用于遍历容器内的所有数据项。

2.顺序容器类

2.1 QList

    QList是最常用的容器类,虽然它是以数组列表(array-list)的形式实现的,但是在其前或后
添加数据非常快,QList以下标索引的方式对数据项进行访问。
    容器类QList<T>,T是一个具体的类型,可以是int、float等简单类型,也可以是Qstring、QDate等类,但 不能是QObject或任何其子类。 在存储QObject对象及其子类对象时,不能直接存对象本身,而是只能存对象的地址。T必须是一个可赋值的类型,即T必须提供一个缺省的构造函数,一个可复制构造函数和一个赋值运算符。
(1)声明 QList
//基本数据类型
QList<int> integerList;
QList<QDate> dateList;
//存储QObject对象的地址
QList <QWidget *> ptr_widgets;
QList <QObject *> ptr_objects;
(2)初始化 QList
QList<QString> list = { "one", "two", "three" };
QWidget * widget1 = new QWidget();
QWidget * widget2 = new QWidget();
QList<QWidget *> ptr_widgets = {widget1, widget2};
(3)QList 基本的添加、插入、替换、删除、移动、修改
1. 增加节点
insert():插入节点到
append():尾部添加节点
prepend() :头部添加节点
operator <<():尾部添加节点或链表
operator+=():尾部添加节点
2. 删除节点
removeAt():删除节点
removeFirst():删除头节点
removeLast():删除尾节点
3. 移动节点
move():链表内移动节点位置
swap():俩个链表交换值(其实交换一下地址映射就能实现)
4. 修改节点值
replace():替换链表内的节点值
(4)QList 定位节点
    QList是有序的链表,可以通过索引来得到。
1. operator [ ] 数组索引符:这个和普通数组一样的使用 [ ] 访问下标方法一致
2. at() 函数:也是通过索引值,也即是下标方式
Qt 推荐使用at()函数,这样的效率更好,因为 at()函数不会发生 深拷贝 ,而另外一种方式会。
QList还提供了一些快捷的 索引 + 返回索引节点 + 删除原索引节点,也就是组合的功能;但是这个是 take…不是get…这样的,这就意味着,这个其实是剪掉一个节点,并返回。
3. takeAt():取得在指定位置的节点
4. takeFirst():取得头节点 ;等价【takeAt(0)】
5. takeLast():取得尾节点
(5)基本常用函数
contains():是否包含节点xxx
count():对指定节点值计数
isEmpty():链表为空
size():链表大小
indexOf():节点位置

2.2 QLinkedList

QLinkedList<T>是链式列表(linked-list)(双向链表容器类),数据项不是用连续的内存存储的,它基于迭代器访问数据项,并且插入和删除数据项的操作时间相同。除了不提供基于下标索引的数据项访问外,QLinkedList的其他接口函数与QList基本相同。

(1)重要特性如下:

  • 动态大小:QLinkedList 的大小是动态的,可以根据需要轻松添加或删除元素。这使得它在处理具有不确定大小的数据集时非常有用。

  • 双向遍历:与 QVector 和 QList 不同,QLinkedList 允许从头到尾以及从尾到头的双向遍历。这种遍历方式在某些场景下会非常有用。

  • 高效的插入和删除操作:在链表的中间插入或删除元素的时间复杂度为 O(1)。这使得 QLinkedList 在需要频繁插入和删除元素的场景中,具有优势。

  • 不需要连续内存:与 QVector 和 QList 相比,QLinkedList 的元素不需要存储在连续的内存空间中。这意味着在内存碎片化的情况下,QLinkedList 可能更容易分配内存。

(2)常用接口

构造函数和析构函数:

  • QLinkedList(): 创建一个空的 QLinkedList。

  • QLinkedList(const QLinkedList<T> &other): 复制构造函数,用另一个 QLinkedList 对象来创建一个新的对象。

  • ~QLinkedList(): 析构函数,用于释放资源。

容量相关接口:

  • bool isEmpty() const: 返回链表是否为空。

  • int size() const: 返回链表中元素的数量。

元素访问接口:

  • T &first(): 返回链表中第一个元素的引用。

  • const T &first() const: 返回链表中第一个元素的常量引用。

  • T &last(): 返回链表中最后一个元素的引用。

  • const T &last() const: 返回链表中最后一个元素的常量引用。

修改接口:

  • void append(const T &value): 在链表末尾添加一个元素。

  • void prepend(const T &value): 在链表开头添加一个元素。

  • void insert(int i, const T &value): 在链表的指定位置插入一个元素。

  • void removeFirst(): 移除链表中的第一个元素。

  • void removeLast(): 移除链表中的最后一个元素。

  • bool removeOne(const T &value): 移除链表中第一个与指定值相等的元素,如果成功移除则返回 true,否则返回 false。

  • int removeAll(const T &value): 移除链表中所有与指定值相等的元素,返回移除的元素个数。

  • void clear(): 清空链表。

查找接口:

  • bool contains(const T &value) const: 检查链表是否包含指定值的元素。

  • int count(const T &value) const: 返回链表中指定值的元素个数。

  • int indexOf(const T &value, int from = 0) const: 返回链表中指定值的第一个元素的索引,如果未找到则返回 -1。

  • int lastIndexOf(const T &value, int from = -1) const: 返回链表中指定值的最后一个元素的索引,如果未找到则返回 -1。

迭代器:

  • iterator begin(): 返回指向链表第一个元素的迭代器。

  • const_iterator begin() const: 返回指向链表第一个元素的常量迭代器。

  • iterator end(): 返回指向链表末尾的迭代器。

  • const_iterator end() const 返回指向链表末尾的常量迭代器。

  • const_iterator cbegin() const: 返回指向链表第一个元素的常量迭代器。

  • const_iterator cend() const: 返回指向链表末尾的常量迭代器。

  • reverse_iterator rbegin(): 返回指向链表最后一个元素的反向迭代器。

  • const_reverse_iterator rbegin() const: 返回指向链表最后一个元素的常量反向迭代器。

  • reverse_iterator rend(): 返回指向链表起始位置之前的反向迭代器。

  • const_reverse_iterator rend() const: 返回指向链表起始位置之前的常量反向迭代器。

  • const_reverse_iterator crbegin() const: 返回指向链表最后一个元素的常量反向迭代器。

  • const_reverse_iterator crend() const: 返回指向链表起始位置之前的常量反向迭代器。

比较操作ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷凝女子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值