目录
Qt 库提供了一组基于C++标准模板的通用容器类。这些类可用于存储指定类型的项,可以实例化为具体的数据类型。C++的标准模板库(STL)中定义了一系列容器,并对应有若干容器类和操作容器用到的迭代器。QT中的容器,相比于STL中的容器,Qt中的容器具有STL的各种功能,更加轻巧、安全和便于使用,而且进行了速度和存储优化,另外,它们还是线程安全的,可以作为只读容器被多个线程访问。这些容器类比 STL 容器更轻、更安全、更易于使用。如果您不熟悉 STL,或者更喜欢以“Qt 方式”做事,则可以使用这些类而不是 STL 类。
Qt 库提供的容器类是隐式共享的,它们是可重入的,并且它们针对速度、低内存消耗和最小的内联代码扩展进行了优化,从而生成更小的可执行文件。此外,在用于访问它们的所有线程将它们用作只读容器的情况下,它们是线程安全的。
Qt 库容器提供用于遍历的迭代器。STL样式的迭代器是最有效的迭代器,可以与Qt和STL的通用算法一起使用。提供 Java 样式的迭代器是为了向后兼容。
与STL类似,Qt的容器类分为顺序容器和关联容器。前者的数据结构是线性表,后者的数据结构是树。顺序容器类有QList,QLinkedList,QVector,QStack,QQueue;关联容器类包括QMap,QMultiMap,QHash,QMultiHash,Qset。同样使用迭代类访问容器中的数据项,Qt提供Java类型的迭代类和STL类型的迭代类。Java类型的迭代易于适用并提供高级功能,而STL类型的迭代效率则会更高一些。
Qt 提供以下顺序容器:QList、QStack 和 QQueue。对于大多数应用程序,QList 是最好使用的类型。它提供了非常快速的追加。如果你确实需要一个链表,请使用 std::list。 QStack 和 QQueue 是提供 LIFO 和 FIFO 语义的遍历类。
Qt 还提供了这些关联容器:QMap、QMultiMap、QHash、QMultiHash 和 QSet。 “Multi”容器方便地支持与单个键关联的多个值。 “哈希”容器通过使用哈希函数而不是在排序集上进行二分搜索来提供更快的查找。
作为特殊情况,QCache和QContiguousCache类在有限的缓存存储中提供对象的高效哈希查找。
QT官方文档提示:从 Qt 5.14 开始,范围构造函数可用于大多数容器类。 QMultiMap 是一个明显的例外。鼓励使用它们来代替各种 from/to 方法。例如:
QList<int> list { 1, 2, 3, 4, 4, 5 };
QSet<int> set(list.begin(), list.end());
/*
将生成一个QSet,其中包含 1, 2, 3, 4, 5.
*/
容器
Class | 描述 |
---|---|
QList<T> | Qlist是最常用的容器类,它存储一组 type (T) 的数据。其内核实现是用数组列表的方式进行存储的(它将给定类型的数值组存储在内存中的相邻位置。),这使得用索引方式获取某个值非常快。在列表的前面或中间插入可能会非常慢,因为这会导致大量项目必须在内存中移动一个位置。 |
QVarLengthArray<T, Prealloc> | 这提供了一个低级可变长度数组。在速度特别重要的地方,可以使用它代替QList。 |
QStack<T> | 这是QList的一个方便的子类,提供“后进先出”(LIFO)语义。它将以下函数添加到QList中已有的函数中:push()、pop()和top()。 |
QQueue<T> | 这是QList的一个方便的子类,提供“先进先出”(FIFO)语义。它将以下函数添加到QList中已有的函数中:enqueue()、dequeue()和head()。 |
QSet<T> | 这提供了具有快速查找的单个数据集和 。QSet是单个数据的集合。基于散列表,存储的数据顺序是不定的。查找值的速度非常快。 |
QMap<Key, T> | 这提供了一个字典(关联数组),它将 Key 类型的键映射到 T 类型的值。通常每个键都与单个值相关联。 QMap 按 Key 顺序存储其数据;如果顺序无关紧要,QHash 是一个更快的选择。 |
QMultiMap<Key, T> | 这是QMap的一个方便的子类,为多值映射提供了一个很好的接口,即一个键可以与多个值关联的映射。 |
QHash<Key, T> | 这与QMap具有几乎相同的API,但提供了更快的查找。QHash以任意顺序存储其数据。 |
QMultiHash<Key, T> | 这是QHash的一个方便的子类,为多值哈希提供了一个很好的接口。 |
容器是可以嵌套的。例如,完全可以使用QMap<QString,QList<int>>,其中键类型为QString而值类型为QList<int>。
容器在与容器同名的单独头文件中定义(例如,<QList>)。为方便起见,容器在 <QtContainerFwd> 中前向声明。
存储在各种容器中的值可以是任何可分配的数据类型。要符合条件,类型必须提供复制构造函数和赋值运算符。对于某些操作,还需要默认构造函数。这涵盖了您可能希望存储在容器中的大多数数据类型,包括基本类型(如int和double)、指针类型和Qt数据类型(如QString、QDate和QTime),但不包括QObject或任何QObject子类(QWidget、QDialog、QTimer等)。如果您尝试实例化QList<QWidget>,编译器将抱怨QWidgets的复制构造函数和赋值运算符被禁用。如果要将这些类型的对象存储在容器中,请将它们存储为指针,例如QList<QWidget*>。
下面是一个满足可分配数据类型要求的自定义数据类型示例: