http://blog.chinaunix.net/uid-24219701-id-4045766.html
存储容器(containers)有时候也被称为集合(collections),是能够在内存中存储其它特定类型的对象,通常是一些常用的数据结构,一般是通用模板类的形式。
Qt 提供了另外一套基于模板的容器类。相比 STL,这些容器类通常更轻量、更安全、更容易使用。
Qt 的容器类提供了隐式数据共享、不可变的特性,并且为速度做了优化,具有较低的内存占用量等。另外一点比较重要的,它们是线程安全的(线程读安全)。这些容器类是平台无关的,即不因编译器的不同而具有不同的实现;隐式数据共享,有时也被称作“写时复制(copy on write)”,这种技术允许在容器类中使用传值参数,但却不会出现额外的性能损失。
Qt 提供了顺序存储容器:QList,QLinkedList,QVector,QStack和QQueue。对于绝大多数应用程序,QList是最好的选择。虽然它是基于数组实现的列表,但它提供了快速的向前添加和向后追加的操作。如果你需要链表,可以使用QLinkedList。如果你希望所有元素占用连续地址空间,可以选择QVector。QStack和QQueue则是 LIFO 和 FIFO 的。
Qt 还提供了关联容器:QMap,QMultiMap,QHash,QMultiHash和QSet。带有“Multi”字样的容器支持在一个键上面关联多个值。“Hash”容器提供了基于散列函数的更快的查找,而非 Hash 容器则是基于二分搜索的有序集合。
另外两个特例:QCache和QContiguousCache提供了在有限缓存空间中的高效 hash 查找。
我们将 Qt 提供的各个容器类总结如下:
l QList
l QLinkedList
l QVector
l QStack
l QQueue
l QSet
l QMap
l QMultiMap
l QHash
l QMultiHash
Qt 的容器类提供了两种风格的遍历器:Java 风格和 STL 风格。
Java 风格的遍历器
Java 风格的遍历器是在 Qt4 首先引入的,是 Qt 应用程序首先推荐使用的形式。这种风格比起 STL 风格的遍历器更方便。方便的代价就是不如后者高效。
Java 风格的遍历器指向的是两个元素之间的位置,而不是指向元素本身。因此,它们可能会指向集合第一个元素之前的位置,也可能指向集合的最后一个元素之后的位置,
每一种容器都有两种 Java 风格的遍历器:一种提供只读访问,一种提供读写访问:
容器 |
只读遍历器 |
读写遍历器 |
QList |
QListIterator |
QMutableListIterator |
QLinkedList |
QLinkedListIterator |
QMutableLinkedListIterator |
QVector |
QVectorIterator |
QMutableVectorIterator |
QSet |
QSetIterator |
QMutableSetIterator |
QMap |
QMapIterator |
QMutableMapIterator |
QHash |
QHashIterator |
QMutableHashIterator |
QLinkedList、QVector和QSet的遍历器接口与QList的是一样的;QHash遍历器的接口则同QMap是一样的。
我们通过下面的代码看看如何使用这种遍历器:
点击(此处)折叠或打开
如果需要修改操作,我们可以使用QMutableListIterator。来看下面的代码:
点击(此处)折叠或打开
QMapItrator也是类似的。例如,
点击(此处)折叠或打开
STL 风格的遍历器
STL 风格的遍历器从 Qt 2.0 就开始提供。这种遍历器能够兼容 Qt 和 STL 的通用算法,并且为速度进行了优化。同 Java 风格遍历器类似,Qt 也提供了两种 STL 风格的遍历器:一种是只读访问,一种是读写访问。我们推荐尽可能使用只读访问,因为它们要比读写访问的遍历器快一些。
容器 |
只读遍历器 |
读写遍历器 |
QList |
QList |
QList |
QLinkedList |
QLinkedList |
QLinkedList |
QVector |
QVector |
QVector |
QSet |
QSet |
QSet |
QMap |
QMap |
QMap |
QHash |
QHash |
QHash |
不同于 Java 风格遍历器,STL 风格遍历器直接指向元素本身。
下面是有关QList的相关代码:
点击(此处)折叠或打开
QMap和QHash的遍历器,* 运算符返回集合键值对。下面的代码,我们打印出QMap的所有元素:
点击(此处)折叠或打开
foreach关键字
如果我们仅仅想要遍历集合所有元素,我们可以使用 Qt 的foreach关键字。这个关键字是 Qt 特有的,
例如,我们使用foreach对QLinkedList进行遍历:
点击(此处)折叠或打开