引言
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;
如果你希望通过迭代器进行插入删除等操作,你需要使用QMutableListIterator。
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);