【Qt】常用的容器

Qt提供了多个基于模板的容器类,这些容器类可用于存储指定类型的数据项。例如常用的字符串列表类 QStringList 可用来操作一个 QList<QString>列表。

Qt的容器类比标准模板库(standard template library,STL)中的容器类更轻巧、使用更安全且更易于使用。这些容器类是隐式共享和可重入的,而且它们进行了速度和存储上的优化,因而可以减小可执行文件大小。此外,它们是线程安全的,即它们作为只读容器时可被多个线程访问。

容器类是基于模板的类,例如常用的容器类 QList<T>,T是一种具体的类型,可以是 int、fioat等简单类型,也可以是 QString、QDate 等类。T必须是一种可赋值的类型,即T必须提供一个默

认的构造函数、一个可复制构造函数和一个赋值运算符。

Qt6 的容器类有 QList、QVector、QStack 、QQueue、 QSet、QMap、QMultilMap、QHash、QMultiHash

一、QList

在Qt中,QList是一个模板类,用于存储一组对象的动态数组。它提供了方便的方法来访问、增加、删除和修改列表中的元素。

QList与C++的标准库容器std::vector类似,但它还提供了一些额外的功能和方便的操作符重载。下面是一些QList的常用操作:

  • 添加元素:使用append()、prepend()等方法将元素添加到列表的末尾或开头。

  • 访问元素:使用at()方法通过索引访问列表中的元素,使用operator\[\]操作符也可以实现相同的功能。

  • 删除元素:使用removeOne()、removeAt()等方法删除列表中的元素。

  • 修改元素:使用replace()方法替换列表中的元素。

  • 列表大小:使用size()方法获取列表的大小,使用isEmpty()方法检查列表是否为空。

  • 迭代访问:使用foreach循环或迭代器对列表进行迭代访问。

除了这些常用方法外,QList还提供了一些其他的功能,如排序、查找、截取子列表等。可以在Qt的官方文档中查看完整的QList类接口和用法。

注意:在使用QList时,需要包含头文件#include <QList>。

二、QVector

在Qt中,QVector是一个模板类,用于存储一组对象的可变大小的数组。它与QList相似,但在某些方面具有不同的特性和性能特点。

与QList相比,QVector在以下情况下可能更适合使用:

  1. 读取和访问速度:QVector提供了随机访问的性能优势。如果需要频繁地通过索引访问元素,QVector通常比QList更快。

  2. 内存占用:QVector的内存占用通常比QList小,因为它可以更有效地管理和分配内存。

  3. 插入和删除操作:对于插入和删除操作,QList通常比QVector更快,尤其在大型数据集的情况下。

除了上述的区别,QVector和QList提供了类似的方法和操作符重载,如append()、prepend()、at()、removeOne()、replace()、size()等等。可以在Qt的官方文档中查看完整的QVector类接口和用法。

注意:在使用QVector时,需要包含头文件#include <QVector>。

三、QStack

QStack是Qt中的一个模板类,它是一个栈容器类,用于实现栈数据结构。

栈(Stack)是一种后进先出(Last-In-First-Out, LIFO)的数据结构,只能在栈的一端(称为栈顶)进行插入和删除操作。

QStack类提供了以下公共成员函数:

  • void push(const T &value):将value插入到栈的顶部。

  • void pop():移除栈顶的元素。

  • T &top():返回栈顶的元素的引用。

  • const T &top() const:返回栈顶的元素的常量引用。

  • bool isEmpty() const:判断栈是否为空。

  • int size() const:返回栈中元素的个数。

QStack类可以存储任意类型的数据,并且提供了访问、插入和删除元素的方法。可以使用QStack类来实现各种栈相关的操作。

四、QQueue

QQueue是Qt中的一个类,用于表示队列数据结构。队列是一种先进先出(First In First Out,FIFO)的数据结构,元素从队列的一端添加,从另一端删除。

QQueue类提供了以下方法来操作队列:

  • enqueue:在队列的末尾添加一个元素。
  • dequeue:删除队列的头部元素,并返回该元素。
  • head:返回队列的头部元素,但不删除它。
  • isEmpty:判断队列是否为空。
  • size:返回队列中元素的个数。

使用QQueue类,可以方便地实现队列的操作。例如,在一个多线程程序中,可以使用QQueue来作为线程之间共享的数据结构,一个线程往队列中添加数据,另一个线程从队列中取出数据进行处理。

五、 QSet

QSet是Qt中的一个类,用于表示集合数据结构。集合是一种不包含重复元素的数据结构,它提供了高效的查找和插入操作。

QSet类提供了以下方法来操作集合:

  • insert:向集合中插入一个元素。
  • remove:从集合中删除一个元素。
  • contains:判断集合中是否包含某个元素。
  • size:返回集合中元素的个数。

QSet类还提供了遍历集合元素的方法,如使用迭代器进行迭代或使用foreach循环

六、QMap

QMap是Qt中的一个类,用于存储键值对的容器。QMap类中的每个元素都是由一个键和一个值组成的。键用于唯一标识一个元素,而值则是与该键关联的数据。QMap中的元素按照键的排序进行存储,并且可以根据键快速地访问到对应的值。这使得QMap非常适用于需要根据键值进行查找、插入和删除操作的场景。QMap类提供了一系列方法来操作存储在其中的键值对,比如插入、移除、查找和遍历等方法。以下是QMap类的一些常用方法:

  • insert(key, value):在QMap中插入一个键值对,如果键已经存在,则会更新对应的值。

  • remove(key):从QMap中移除一个指定键的元素。

  • contains(key):判断QMap中是否包含指定的键。

  • value(key):返回指定键对应的值。

  • keys():返回QMap中所有的键。

  • values():返回QMap中所有的值。

  • size():返回QMap中键值对的个数。

  • clear():移除QMap中的所有元素。

QMap还提供了一些其他的功能,比如按范围查找、排序等。需要注意的是,QMap中的键是唯一的,不允许出现重复的键。如果插入了重复的键,则会替换掉之前的键值对。使用QMap时,需要注意元素的排序和查找的效率。如果需要按照键的顺序进行访问,可以使用QMap的有序版本QMap。QMap类是基于红黑树实现的,因此它的插入、删除和查找操作的时间复杂度为O(log n),其中n是QMap中元素的个数。

注意:使用QMap类需要包含头文件#include <QMap>。

七、QMultilMap

QMultiMap是Qt中的一个类,它是QMap的多重映射版本。QMultiMap类与QMap类一样,同时存储了键值对,但与QMap不同的是,QMultiMap允许存在相同的键,即一个键可以对应多个值。QMultiMap类提供了一系列方法来操作多重映射中的键值对,包括插入、移除、查找和遍历等操作。与QMap类相似,QMultiMap类也按照键的排序进行存储,并且可以通过键快速访问到对应的值。对于相同的键,QMultiMap会按照插入的顺序保存多个值。以下是QMultiMap类的一些常用方法:

  • insert(key, value):在QMultiMap中插入一个键值对。

  • remove(key):从QMultiMap中移除一个指定键的所有元素。

  • remove(key, value):从QMultiMap中移除一个指定键值对。

  • values(key):返回指定键对应的所有值。

  • contains(key):判断QMultiMap中是否包含指定的键。

  • keys():返回QMultiMap中所有的键。

  • size():返回QMultiMap中键值对的个数。

  • clear():移除QMultiMap中的所有元素。

QMultiMap也提供了按范围查找、排序等功能。使用QMultiMap时,可以很方便地处理一个键对应多个值的情况,比如用于处理消息订阅、事件处理等场景。 需要注意的是,QMultiMap中的键可以重复,但是如果插入了相同的键值对,则会保存多个值,而不会替换掉之前的值。QMultiMap类也是基于红黑树实现的,因此插入、删除和查找操作的时间复杂度为O(log n),其中n是QMultiMap中元素的个数。

八、QHash

QHash是Qt中的一个类,用于实现哈希表(Hash Table)数据结构。QHash类类似于C++ STL中的std::unordered_map,它提供了一种以键值对的方式存储和访问数据的方法。与QMap类不同的是,QHash并不会对其元素进行排序,而是通过哈希函数将键转化为索引,并通过索引直接访问元素,从而实现了快速查找和插入。QHash类提供了一系列方法来操作哈希表中的元素,包括插入、移除、查找和遍历等操作,以下是QHash类的一些常用方法:

  • insert(key, value):在QHash中插入一个键值对。

  • remove(key):从QHash中移除一个指定键的元素。

  • value(key):返回指定键对应的值。

  • contains(key):判断QHash中是否包含指定的键。

  • keys():返回QHash中所有的键。

  • values():返回QHash中所有的值。

  • size():返回QHash中键值对的个数。

  • clear():移除QHash中的所有元素。

QHash的底层实现使用了哈希表技术,通过哈希函数将键转换为索引,并使用链地址法解决哈希冲突。因此,对于大多数操作,QHash的时间复杂度为O(1)。值得注意的是,QHash对键的顺序并不做保证,即无法保证键的插入顺序和遍历顺序是一致的。QHash类还提供了与STL兼容的迭代器,可以使用迭代器来遍历QHash中的元素。使用QHash时,需要保证键类型是可哈希的(即提供了哈希函数),并支持比较操作符。QHash在很多场景中都是非常有用的,比如用于快速查找和存储大量的键值对,或者用于实现缓存、索引结构等。

相关推荐
用户8055336980320 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner21 小时前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz6 天前
QML Hello World 入门示例
qt
xcyxiner9 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner10 天前
DicomViewer (添加模型类)3
qt
xcyxiner11 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00613 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术13 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript