Qt的容器类介绍

博客介绍了Qt常用容器类,包括Java风格和STL风格迭代器及其常用API。重点讲解了QString类,它提供Unicode字符串,采用隐式共享减少内存使用。还介绍了QByteArray类和QVariant类,前者存储字节数组,后者是常见Qt数据类型共用体,且说明了可自动进行的类型转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  常用容器类简介表

简介

QList<T>

这是目前最常用的容器类。它存储了给定类型的值的一个列表,而这些值可以通过索引访问。在内部,QList使用数组来实现,以确保进行快速的基于索引的访问。可以使用QList::append()和QList::prepend()在列表的俩端添加项目,也可以使用QList::insert()在列表的中间插入项目。常用的QStringList继承自QList<QString>

QLinedList<T>

除了使用迭代器而不使用整数索引进行项目访问外,它基本与QList相同。当向一个很大的列表的中间插入项目时,QLinkedList比QList拥有更好的性能,而且它拥有更好的迭代器语义(当迭代器QLinkedList的一个项目后,只要这个项目还存在,那么迭代器就依然有效;二挡迭代器指定QList中的一个项目后,如果QList进行了插入或者删除操作,那么这个迭代器就无效了)

QVector<T>

它在内存的相邻位置存储给定类型的值的一个数组。在vertor的前面或者中间插入项目是非常缓慢的,因为这样可能导致大量的项目再村内中移动一个位置

QStack<T>

它是QVector的一个便捷子类,提供了后进先出(LIFO)语义。它添加了push(),pop()和top()等函数

QQueue<T>

它是QList的一个便捷子类,提供了先进先出(FIFO)语义。它添加了enqueue(),dequeue()和head()等函数

QSet<T>

它提供了一个可以快速查询单值的数学集

QMap<Key,T>

它提供了一个字典(关联数组),将Key类型的键值映射到T类型的值上。一般每一个键关联一个单一的值。QMap使用键顺序来存储它的数据;如果不关心存储顺序,那么可以使用QHash来代替它,因为QHash速度更快

QMultiMap<Key,T>

是QMap的一个便捷类,提供了实现多值映射的接口函数,例如一个键可以联多个值

QHash<Key,t>

与QMap拥有基本相同的接口,但是它的查找速度更快。QHash的数据是任意的顺序存储的

QMultiHash<Key,T>

它四QHash的一个便捷类提供了实现多值散列的接口函数

Java风格迭代器

容器

只读迭代器

读/写迭代器

QList<T>,QQueue<T>

QListIterator<T>

QMutableListIterator()

QLikeedList<T>

QLikeedListIterator<T>

QMutableLikeedListIterator()

QVector<T>,QStack<T>

QVectorIterator<T>

QMutableVectorIterator<T>

QSet<T>

QSetIterator<T>

QMutableSetIterator<T>

QMap<Key,T>

QMultiMap<Key,T>

QMapIterator<Key,T>

QMutableMapIterator<Key,T>

QHash<Key,T>

QMultiHash<Key,T>

QHashIterator<Key,T>

QMutableHashIterator<Key,T>

QListIterator常用API

函数

行为

toFront()

将迭代器移动到列表的最前面(第一个项目之前)

toBack()

将迭代器移动到列表的最后面(最后一个项目之后)

hasNext()

如果迭代器没有到达列表的最后面,那么返回true

next()

返回下一个项目,并使迭代器前移一个位置

peekNext()

返回下一个项目,但不移动迭代器

hasPrevious()

如果迭代器没有到达列表的最前面,那么返回true

Previous()

返回前一个项目,并使迭代器返回移动一个位置

peekPrevious()

返回前一个项目,但不移动迭代器

STL风格迭代器

容器

只读迭代器

读/写迭代器

QList<T>,QQueue<T>

QList<T>::const_iterator

QList<T>::iterator

QLikeedList<T>

QLikeedList<T>::const_iterator

QLikeedList<T>::iterator

QVector<T>,QStack<T>

QVector<T>::const_iterator

QVector<T>::iterator

QSet<T>

QSet<T>::const_iterator

QSet<T>::iterator

QMap<Key,T>

QMultiMap<Key,T>

QMap<Key,T>::const_iterator

 

QMap<Key,T>::iterator

 

QHash<Key,T>

QMultiHash<Key,T>

QHash<Key,T>::const_iterator

 

QHash<Key,T>::iterator

 

STL风格迭代器常用API

表达式

行为

*i

返回当前项目

++i

前移迭代器到下一个项目

i+=n

使迭代器前移n个项目

--i

使迭代器往回移动一个项目

i-=n

使迭代器返回移动n个项目

i-j

返回迭代器i和迭代器j之间的项目的数目

QString

QString类提供了一个Unicode字符串。QString使用隐式共享来减少内存使用和避免不必要的数据复制。

  1. 隐式共享

隐式共享又称为写时复制。

  1. 编辑操作
  2. 查询操作
  3. 转换操作

QString类函数参数格式

格式

含义

e

格式如:[-]9.9e [+]999

E

格式如:[-]9.9E [+]999

f

格式如:[-]9.9

g

使用e或者f格式,选择其中最精简的

G

使用E或者f格式,选择其中最精简的

QByteArrayQVariant

QBytrArray类提供了一个字节数组,它可以用来存储原始字节(包括’\0’)和传统的以’\0’结尾的8位字符串。使用QBytrArray比使用const char*要方便很多,在后台,它总是保证数据以一个’\0’结尾,而且使用隐式共享来减少内存的使用和避免不必要的数据复制。

QVariant类像是常见的Qt数据类型的一个共用体,一个QVariant对象在一个时间只保存一个单一类型的单一的值(有些类型可能是多值的,比如字符串列表)。可以使用toT()T表示一种数据类型)函数将QVariant对象转换为T类型,并且获取它的值。这里toT()函数会复制以前的QVariant对象,然后对其进行转换,所以以前的QVariant对象并不会改变。

可以自动进行的类型转换

类型

自动转换到

Bool

CharDoubleIntLongLongStringUIntULongLong

ByteArray

DoubleIntLongLongStringUIntULongLong

Char

BoolIntUIntLongLongULongLong

Color

String

Date

DateTimeString

DateTime

DateStringTime

Double

BoolIntLongLongStringUIntULongLong

Font

String

Int

BoolCharDoubleLongLongStringUIntULongLong

KeySequence

IntString

List

StringList(如果列表中的项目可以转换为字符串)

LongLong

BoolByteArrayCharDoubleIntStringUIntULongLong

Point

PointF

Rect

RectF

String

BoolByteArrayCharColorDataDateTimeDoubleFontIntKeySequenceLongLongStringListTimeUIntULongLong

StringList

ListString(如果列表中只包含一个项目)

Time

String

UInt

BoolCharDoubleIntLongLongStringULongLong

ULongLong

BoolCharDoubleIntLongLongStringUInt

 

### Qt 容器类概述 Qt 提供了一系列高效的容器类来存储和管理数据集合。这些容器类被设计成模板化,可以容纳任何类型的对象[^1]。 #### QList 类 `QList<T>` 是一个顺序容器,提供了快速的索引操作以及相对快速的追加操作。对于大多数应用场景来说,这是最常用的列表实现方式之一。它内部实现了数组结构,在访问随机位置上的元素时性能较好。 ```cpp // 创建并初始化一个整数型的QList QList<int> numbers; numbers << 1 << 2 << 3; // 访问第一个元素 int firstNumber = numbers.first(); // 追加新元素到末尾 numbers.append(4); ``` #### QLinkedList 类 `QLinkedList<T>` 实现了一个双向链表的数据结构,适合频繁地在中间插入或删除节点的情况。相比于 `QList`, 对于这类操作效率更高;但在通过下标查找特定项的速度上会慢一些。 ```cpp // 初始化字符串类型的QLinkedList QLinkedList<QString> names; names.push_back("Alice"); names.prepend("Bob"); // 遍历整个链接列表打印所有名字 for (auto it = names.begin(); it != names.end(); ++it){ qDebug() << *it; } ``` #### 容器对比 当选择使用哪种容器时,应该考虑具体的应用场景需求: - 如果程序经常执行随机存取或者只需要在一端添加/移除项目,则应优先选用 `QList`. - 当涉及到大量的中部插入与删除动作时,推荐采用 `QLinkedList`. 此外,两种容器都支持迭代器遍历、STL风格算法接口等功能特性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值