Qt常用容器类归纳

一、容器类介绍

Qt提供了许多基于模板的容器类。这些类可以被用来存储特定类型的项。

Qt容器类的两种风格迭代器:

① Java-style iterators

② STL- style iterators

因为QList、QLinkedList、QVector、QStack和QQueue等容器中数据都是一个接一个线性存储的,故称为顺序容器。对大部分应用程序来说,QList都是一个很好的选择。尽管它在底层被实现为一个array-list(数组列表),但它为我们提供了非常快速的添加操作,可以在其头部和尾部进行添加操作。若需确保元素占用连续的内存空间,可以使用QVector。QStack和QQueue是两个提供了LIFO(后进先出)和FIFO(先进先出)语义的类。

因为QMap、QMultiMap、QHash、QMultiHash和QSet等容器存储的是<键,值>对,比如QMap,所以称为关联容器。"Multi"容器又支持一个key可以关联多个value。"Hash"容器通过使用一个hash函数而不是二分搜索提供了更快速的查找操作。

这些容器类有以下特点:

1.隐式共享的;

2.可重入的;

3.在速度上进行了优化;

4.内存占用少,内联代码扩展少,从而可以产生更小的可执行文件;

5.当他们被用作只读容器时,仍可以认为是线程安全的。

容器是可以嵌套使用的。例如,可以使用QMap>这种类型,其key的类型是QString,值类型是QList

将这些容器类的总结在下表中:

QList  这是目前最通用的容器类。它存储了给定类型T的值一个列表,这些值可以通过索引(下标)访问。其实,在内部QList被实现为一个数组,确保快速的基于索引(下标)的访问。可以使用QList::append()和QList::prepend()向链表的两端添加元素,或者使用QList::insert()在链表的中间插入元素。并且,和其他容器相比,更重要的是,QList在可执行文件中展开的代码量是非常少的,是经过高度优化的。常用的QStringList继承自QList
QLinkedList  这个容器类类似于QList,只不过它是使用迭代器来访问,而不是下标。当从中间插入时,它的效率比QList还要高。并且,它有更好的迭代器语义。
即指向QLinkedList中某个元素的迭代器,只有该元素存在就会一直保持有效,而指向QList中某元素的迭代器,在向QList进行任意插入或删除时都会导致该迭代器失效。
QVector 这个容器类会在一块相邻的内存中存储一个给定类型的值的数组。在一个vector的前端或中间插入是非常慢的,因为这会导致大量现存的元素移动以为新的
元素腾出位置。
QStack 继承自QVector,是其便捷子类,提供了后进先出(LIFO)的语义。添加了push()、pop()及top()等函数。
QQueue 继承自QList,是其便捷子类,提供了先入先出(FIFO)的语义。添加了enqueue()、dequeue()和head()等函数
QSet

这个容器类提供了不允许有重复值的集合,提供可以快速查询单值的数字集。

QMap 这个容器类提供了一个字典形式(关联数组)的容器,它会将Key类型的值映射到T类型的value上。通常情况下,每一个key只关联一个值。并且,QMap会按Key的顺序来存储相应的值;所以,如果不关心元素的存储顺序,QHash是一个更好的选择,因为QHash速度更快。
QMaultiMap 继承自QMap,是其便捷子类,提供了实现多值映射的接口函数,也就是说,该容器中的一个key可以关联多个值。
QHash 该容器类拥有与QMap几乎一样的接口,但它提供了更快速的查找操作。并且,该类会按任意的顺序存储值。
QMultiHash 继承自QHash,是其便捷子类,提供了实现多值散列的接口函数。

二、通用算法

Qt还提供了在任意容器上执行相关操作的通用算法。

qSort()算法对一个连续容器进行排序,qBinaryFind()在经过排序的连续容器上执行一个二进制搜索。

qTtableSort()算法与qSort()很相似,但qStableSort()算法还可以保证进行对等比较的项在排序之后表现与之前相同的排序。

的头文件声明了在容器类上实现基本算法的一套全局模板函数。这些函数中的大部分都是在STL风格上的迭代器上工作的。

qFind()算法在容器中查找一个特定的值。它接受一个“begin”和一个“end”迭代器,并且返回一个与其匹配的指向第一项的迭代器;如果没有匹配的项,则返回“end”

qBinaryFind()算法执行的搜索操作与qFind类似,其区别在于qBinaryFind()算法假设项都是以升序的顺序存储的,并且使用了快速二分搜索而不是qFind()算法的线性搜索。

qFill()算法采用了一个特定的值初始化一个容器

qCopy()算法将一个容器类的值复制到另一个容器类中

qDeleteAll()算法对每一个存储在容器类中的指针调用delete。这仅对于那些为指针类型的容器类才有意义的,在调用之后,这些项仍然作为悬摆指针存在于容器类中上

qSwap()算法可以交换两个变量的值。

返回参数绝对值的qAbs()函数,返回最大、最小值的qMax()、qMin()函数。


你可能感兴趣的:(Qt)