Qt 提供了顺序存储容器:QList,QLinkedList, QVector, QStack和QQueue,


 还提供了关联容器:QMap, QMultiMap, QHash, QMUltiHash和QSet。


  • QList<T>:这是至今为止提供的最通用的容器类。它将给定的类型 T 的对象以列表的形式进行存储,与一个整型的索引关联。QList 在内部使用数组实现,同时提供基于索引的快速访问。我们可以使用 QList::append() 和 QList::prepend() 在列表尾部或头部添加元素,也可以使用 QList::insert() 在中间插入。相比其它容器类,QList 专门为这种修改操作作了优化。QStringList 继承自 QList<QString>。
  • QLinkedList<T>:类似于 QList,除了它是使用遍历器进行遍历,而不是基于整数索引的随机访问。对于在中部插入大量数据,它的性能要优于 QList。同时具有更好的遍历器语义(只要数据元素存在,QLinkedList 的遍历器就会指向一个合法元素,相比而言,当插入或删除数据时,QList 的遍历器就会指向一个非法值)。
  • QVector<T>:用于在内存的连续区存储一系列给定类型的值。在头部或中间插入数据可能会非常慢,因为这会引起大量数据在内存中的移动。
  • QStack<T>:这是 QVector 的子类,提供了后进先出(LIFO)语义。相比 QVector,它提供了额外的函数:push(),pop() 和 top()。
  • QQueue<T>:这是 QList 的子类,提供了先进先出(FIFO)语义。相比 QList,它提供了额外的函数:enqueue(),dequeue() 和 head()。
  • QSet<T>:提供单值的数学上面的集合,具有快速的查找性能。
  • QMap<Key, T>:提供了字典数据结构(关联数组),将类型 T 的值同类型 Key 的键关联起来。通常,每个键与一个值关联。QMap 以键的顺序存储数据;如果顺序无关,QHash 提供了更好的性能。
  • QMultiMap<Key, T>:这是 QMap 的子类,提供了多值映射:一个键可以与多个值关联。
  • QHash<Key, T>:该类同 QMap 的接口几乎相同,但是提供了更快的查找。QHash 以字母顺序存储数据。
  • QMultiHash<Key, T>:这是 QHash 的子类,提供了多值散列。   

Qt 的容器类提供了两种风格的遍历器:Java 风格和 STL 风格。这两种风格的遍历器在通过非 const 函数对集合进行修改时都是不可用的。


        Java 风格的遍历器


         


容器

只读遍历器

读写遍历器

QList<T>, QQueue<T>

QListIterator<T>

QMutableListIterator<T>

QLinkedList<T>

QLinkedListIterator<T>

QMutableLinkedListIterator<T>

QVector<T>, QStack<T>

QVectorIterator<T>

QMutableVectorIterator<T>

QSet<T>

QSetIterator<T>

QMutableSetIterator<T>

QMap<Key, T>, QMultiMap<Key, T>

QMapIterator<T>

QMutableMapIterator<T>

QHash<Key, T>, QMultiHash<Key, T>

QHashIterator<T>

QMutableHashIterator<T>


Java 风格的遍历器指向的是两个元素之间的位置,而不是指向元素本身。

    因此,它们可能会指向集合第一个元素之前的位置,也可能指向集合的最后一个元素之后的位置。

QList<QString> list;

list << "A" << "B" << "C" << "D";

  
QListIterator<QString> i(list);

while (i.hasNext()) {

    qDebug() << i.next();

}
QMap<int, QWidget *> map;

QHash<int, QWidget *> hash;

  
QMapIterator<int, QWidget *> i(map);

while (i.hasNext()) {

    i.next();

    hash.insert(i.key(), i.value());

}


    STL 风格的遍历器


容器

只读遍历器

读写遍历器

 QList<T>, QQueue<T>

QList<T>::const_iterator

QList<T>::iterator

 QLinkedList<T>

QLinkedList<T>::const_iterator

QLinkedList<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 风格的遍历器具有类似数组指针的行为。例如,我们可以使用 ++ 运算符让遍历器移动到下一个元素,使用 * 运算符获取遍历器所指的元素。

 

QLinkedList<QString> list;

...

foreach (const QString &str, list) {

    qDebug() << str;

}