QT学习笔记(八):顺序容器和关联容器

一、前言

在Qt库中为我们提供了一系列的基于模板的容器类(container classes)。这些类可以被用来存储特定类型的项(items)。例如,如果你需要一个大小可以变得QString数组,那么可以使用QVector。

与STL中的容器类相比:这些容器类都是隐式共享的,可重入的,并且在速度上进行了优化,内存占用少,内联代码扩展少,从而可以产生更小的可执行文件。此外,当他们被用作只读容器时,还是线程安全的。
如果不熟悉STL或者更喜欢使用QT 方式来进行编程,那么久可以使用这些容器来代替STL的类。

二、容器介绍

2.1 顺序容器

Qt中的容器和STL中的类似,也分为序列式容器和关联式容器。
顺序容器:是指容器中的数据在内存空间中都为一个接一个的线性存储。
如:QList、QLinkedList、QVector、QStack、QQueue…

2.2 关联容器

除了序列式容器,Qt中还提供了关联式容器:因为这些容器储存的是<键,值>对,比如QMap<Key,T>,所以称为关联容器。
如:QMap,QMultiMap,QHash,QMultiHash,QSet…
"Multi"容器又支持一个key可以关联多个value。"Hash"容器通过使用一个hash函数而不是二分搜索提供了更快速的查找操作。

我们常用的顺序容器类的总结在下表中:

介绍
QList< T > 这是最通用的一个容器类。它里面存储了给定类型T的一个列表,这个列表可以使用下标来访问。其实,在底层QList被实现为一个数组,确保基于下标的访问非常快速。可以使用QList::append()和QList::prepend()向链表的两端添加元素,或者使用QList::insert()在链表的中间插入元素。并且,和其他容器相比,更重要的是,QList在可执行文件中展开的代码量是非常少的,是经过高度优化的。QStringList就继承自QList。
QLinkedList< T > 这个容器类类似于QList,只不过它是使用迭代器来访问,而不是下标。当从中间插入时,它的效率比QList还要高。并且,它有更好的迭代器语义。即指向QLinkedList中某个元素的迭代器,只有该元素存在就会一直保持有效,而指向QList中某元素的迭代器,在向QList进行任意插入或删除时都会导致该迭代器失效。
QVector< T > 这个容器类会在一块相邻的内存中存储一个给定类型的值的数组。在一个vector的前端或中间插入是非常慢的,因为这会导致大量现存的元素移动以为新的元素腾出位置。
QStack< T > 这个容器类继承自QVector,提供了“先入后出”的语义。
QQueue< T > 这个容器类继承自QList,提供了“先入先出”的语义。
QSet< T > 这个容器类提供了不允许有重复值的集合,提供快速的查找效率。
QMap<Key, T> 这个容器类提供了一个字典形式的容器,它会将Key类型的值映射到T类型的value上。通常情况下,每一个key只关联一个值。并且,QMap会按Key的顺序存储相应的值;所以,如果不关心元素的存储顺序,QHash是一个更好的选择。
QMaultiMap<Key, T> 这个容器类继承自QMap,提供了多值的字典,也就是说,该容器中的一个key可以关联多个值。
QHash<Key, T> 这个容器类的API和QMap几乎一样,但它提供了更快速的查找操作。并且,该类会按任意的顺序存储值。
QMultiHash<Key, T> 这个容器类继承自QHash,提供了多值hash表。

在这里插入图片描述

二、顺序容器示例

在这里插入图片描述
QList 是最常用的容器类,尽管它在底层被实现为一个array-list,但它为我们提供了非常快速的添加操作,包括在头部添加和在尾部添加。当然,如果你确实需要一个linked-list,可以使用QLinkedList ,如果你想确保你的元素占用连续的内存空间,可以使用QVector。而QStack和QQueue是两个提供了LIFO和FIFO语义的方便类。
QList 提供下标索引方式访问数据项,如同数组一样,也提供 at() 函数,例如:

QList<QString> list;
list << "one" << "two" << "three";
QString str1=list[1]; //str1=="two"
QString str0=list.at(0); //str0=="one"

QT 控制台程序,QList类 相关操作示例:

#include <QCoreApplication>
#include <QList>
#include <QDebug>
int main(int argc, char *argv[])
{
   
    QCoreApplication a(argc, argv);
    
    QList<QString
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值