引言
Qt中提供了一系列的基于模板的容器类,这些类被用来存储指定类型的元素。例如,你需要一个可变长的QString的数组,你可以使用QVector<QString>, 相对于STL容器,Qt中这些容器类都是轻量级的,更安全,更容易使用,他们都是可重入的,更优化的性能,更低的内存消耗,最小的代码膨胀。你可以通过两种方式遍历容器中的元素,一种就是Java风格的,这种方式的迭代器易于使用,提供了比较上层的功能,另外一种是STL风格,它提供了一种更轻量级,效率更高的方式, 可以同Qt和STL中的算法联合使用,更为强大。
Qt提供而来如下的一些序列化的容器:QList, QLinkedList, QVector, QStack, and QQueue. 对于大多数的程序,QList基本就能满足要求,尽管它是以array-list实现的,但它同样可以提供快速的插入操作。如果你真的必须要使用linked-list,那么你可以使用QLinkedList;如果你想数组元素占据一段连续的存储空间,那么你可以使用QVector. 最后 QStack 和 QQueue 提供方便的LIFO和FIFO 的功能.
Qt同样提供了如下的一些关联容器:QMap, QMultiMap, QHash, QMultiHash, and QSet. 其中带有"Multi"的容器,他们支持1key - n value这样的键值对。 带有"hash"的容器使用Hash函数替代了二叉树查找,从而提供了快速查找的功能。
QCache 和 QContiguousCache提供在高速缓冲存储器内进行高效的hash查找。
1> QLinkedList<T> 基于链表实现,元素存储空间不连续,提供基于index的对元素的快速访问,有较多插入操作,删除时建议使用。 类似于QList,但是一般通过迭代器访问元素,而不是index。
2> QVector<T> 存储空间连续,插入操作性能不理想,访问性能佳。 数组的区别在于:可以随时改变大小。
3> QList<T> 集合了QLinkedList<T>和QVector<T>的优点 具有很好的扩展性,比如QStringList。 QList::append():后端插入 QList::prepend(): 前端插入 QList::insert():按index插入
4>QStack<T> 继承于QVector,提供LIFO功能。 新增push(), pop(), 和 top()等。
5> QQueue<T> 继承于QList,提供FIFO功能。 新增enqueue(), dequeue(), and head().
6> QSet<T> 提供对不可重复的集合的快速查找。
7> QMap<Key, T> 按照键排序,存储键值对。
8> QMultiMap<Key, T> 与QMap不同在于,一键可以对应多值。
9> QHash<Key, T> 与QMap类似,不同之处在于,对于元素查找,利用hash函数进行,并且元素并没有按照键值排序。
10> QMultiHash<Key, T> 与QHash的不同之处在于,可以一键对应多值。
1> QList Java风格的调用:
//Java-style QList<QString> list_javaSty; list_javaSty << "111" << "222" << "333" << "444"; list_javaSty << "555"; QListIterator<QString> it(list_javaSty); while (it.hasNext()) qDebug() << it.next();
STL风格:
//stl-style QList<QString> list_stlSty; list_stlSty << "AAA" << "BBB" << "CCC" << "DDD"; list_stlSty << "EEE"; QList<QString>::iterator i; for (i = list_stlSty.begin(); i != list_stlSty.end(); ++i) qDebug() << *i;
QList<int> int_list; int_list << 23 << 42 << 67 << 23 << 83; QMutableListIterator<int> i(int_list); while (i.hasNext()) { if (i.next() > 50) i.setValue(0); qDebug() << i.value(); }
2> QMap QMap中的key-value对是升序排列的 插入和删除操作中都可以使用[]运算符,其下标为key;为避免创建不必要的空值,推荐用vlaue()而不是[]从QMap中取值。 QMap<K,T>中的K和T除了要求具备默认构造函数、拷贝构造函数和赋值运算符外,K还必须支持operator <,因为这样才能实现前面提到的升序排列。 keys() & values() QMap的特性是单值;QMultiMap<K,T>则支持同一关键字下多值的存在,插入操作由insertMulti()完成
例子: 删除键值以city结尾的元素。
QMap<QString, QString> map; map.insert("Paris", "France"); map.insert("Guatemala City", "Guatemala"); map.insert("Mexico City", "Mexico"); map.insert("Moscow", "Russia"); QMutableMapIterator<QString, QString> i(map); while (i.hasNext()) { if (i.next().key().endsWith("City")) i.remove(); } foreach (const QString &str, map.keys()) qDebug() << str << ":" << map.value(str);