Qt容器遍历

http://blog.chinaunix.net/uid-24219701-id-4045766.html

存储容器(containers)有时候也被称为集合(collections),是能够在内存中存储其它特定类型的对象,通常是一些常用的数据结构,一般是通用模板类的形式。

Qt 提供了另外一套基于模板的容器类。相比 STL,这些容器类通常更轻量、更安全、更容易使用。

Qt 的容器类提供了隐式数据共享、不可变的特性,并且为速度做了优化,具有较低的内存占用量等。另外一点比较重要的,它们是线程安全的(线程读安全)。这些容器类是平台无关的,即不因编译器的不同而具有不同的实现;隐式数据共享,有时也被称作“写时复制(copy on write)”,这种技术允许在容器类中使用传值参数,但却不会出现额外的性能损失。

Qt 提供了顺序存储容器:QListQLinkedListQVectorQStackQQueue。对于绝大多数应用程序,QList是最好的选择。虽然它是基于数组实现的列表,但它提供了快速的向前添加和向后追加的操作。如果你需要链表,可以使用QLinkedList。如果你希望所有元素占用连续地址空间,可以选择QVectorQStackQQueue则是 LIFO 和 FIFO 的。

Qt 还提供了关联容器:QMapQMultiMapQHashQMultiHashQSet。带有“Multi”字样的容器支持在一个键上面关联多个值。“Hash”容器提供了基于散列函数的更快的查找,而非 Hash 容器则是基于二分搜索的有序集合。

另外两个特例:QCacheQContiguousCache提供了在有限缓存空间中的高效 hash 查找。

我们将 Qt 提供的各个容器类总结如下:

QList<T>:这是至今为止提供的最通用的容器类。它将给定的类型 的对象以列表的形式进行存储,与一个整型的索引关联。QList在内部使用数组实现,同时提供基于索引的快速访问。我们可以使用 QList::append()QList::prepend()在列表尾部或头部添加元素,也可以使用QList::insert()在中间插入。相比其它容器类,QList专门为这种修改操作作了优化QStringList继承自QList<QString>

QLinkedList<T>:类似于 QList,除了它是使用遍历器进行遍历,而不是基于整数索引的随机访问。对于在中部插入大量数据,它的性能要优于QList

QVector<T>:用于在内存的连续区存储一系列给定类型的值。在头部或中间插入数据可能会非常慢,因为这会引起大量数据在内存中的移动。

QStack<T>:这是QVector的子类,提供了后进先出(LIFO

QQueue<T>:这是QList的子类,提供了先进先出(FIFO

QSet<T>:提供单值的数学上面的集合,具有快速的查找性能。

QMap<Key, T>:提供了字典数据结构(关联数组),将类型 的值同类型 Key 的键关联起来。通常,每个键与一个值关联。QMap以键的顺序存储数据;如果顺序无关,QHash提供了更好的性能。

QMultiMap<Key, T>:这是QMap的子类,提供了多值映射:一个键可以与多个值关联。

QHash<Key, T>:该类同QMap的接口几乎相同,但是提供了更快的查找。QHash以字母顺序存储数据

QMultiHash<Key, T>:这是QHash的子类,提供了多值散列。



Qt 的容器类提供了两种风格的遍历器:Java 风格和 STL 风格

Java 风格的遍历器

Java 风格的遍历器是在 Qt4 首先引入的,是 Qt 应用程序首先推荐使用的形式。这种风格比起 STL 风格的遍历器更方便。方便的代价就是不如后者高效。
Java 风格的遍历器指向的是两个元素之间的位置,而不是指向元素本身。因此,它们可能会指向集合第一个元素之前的位置,也可能指向集合的最后一个元素之后的位置,

每一种容器都有两种 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>


QLinkedList
QVectorQSet的遍历器接口与QList的是一样的;QHash遍历器的接口则同QMap是一样的

我们通过下面的代码看看如何使用这种遍历器:

点击(此处)折叠或打开

  1. QList<QString> list;
  2. list << "A" << "B" << "C" << "D";
  3.  
  4. QListIterator<QString> i(list);
  5. while (i.hasNext()) {
  6.     qDebug() << i.next(); 
  7. }


如果需要修改操作,我们可以使用QMutableListIterator。来看下面的代码:

点击(此处)折叠或打开

  1. QMutableListIterator<int> i(list);
  2. while (i.hasNext()) {
  3.     if (i.next() == “B”) {
  4.         i.setValue(“b”);     //i.next()="b";
  5.     }
  6. }

QMapItrator也是类似的。例如,

点击(此处)折叠或打开

  1.    QMap<int, QString> map;
  2.    map.insert(1,"A");
  3.    map.insert(2,"B");
  4.    map.insert(3,"C");

  5.    QMapIterator<int, QString> i(map);
  6.    while (i.hasNext()) {
  7.        if(i.next().key() == 2)
  8.            qDebug() << i.value();
  9.    }

 

STL 风格的遍历器

STL 风格的遍历器从 Qt 2.0 就开始提供。这种遍历器能够兼容 Qt 和 STL 的通用算法,并且为速度进行了优化。同 Java 风格遍历器类似,Qt 也提供了两种 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>::iter


不同于 Java 风格遍历器,STL 风格遍历器直接指向
元素本身

下面是有关QList的相关代码:

点击(此处)折叠或打开

  1. QList<QString> list;
  2. list << "A" << "B" << "C" << "D";
  3.  
  4. QList<QString>::iterator i;
  5. for (= list.begin(); i != list.end(); ++i) {
  6.   *= (*i).toLower(); // 使用 * 运算符获取遍历器所指的元素
  7.    qDebug()<<*i;
  8. }


QMap和QHash的遍历器,运算符返回集合键值对。下面的代码,我们打印出QMap的所有元素:

点击(此处)折叠或打开

  1. QMap<int, int> map;
  2.  
  3. QMap<int, int>::const_iterator i;
  4. for (= map.constBegin(); i != map.constEnd(); ++i) {
  5.     qDebug() << i.key() << ":" << i.value();
  6. }

foreach关键字

如果我们仅仅想要遍历集合所有元素,我们可以使用 Qt foreach关键字。这个关键字是 Qt 特有的,

例如,我们使用foreachQLinkedList进行遍历:


点击(此处)折叠或打开

  1. QLinkedList<QString> list;
  2. ...
  3. QString str;
  4. foreach (str, list) {
  5.     qDebug() << str;
  6. }

猜你喜欢

转载自blog.csdn.net/tjcwt2011/article/details/80664214