Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Qt容器类介绍和使用

From Wiki
Jump to: navigation, search
Article Metadata

兼容于
平台:
Symbian

文章
Amazing110 在 30 Dec 2011 创建
最后由 hamishwillee 在 11 Oct 2012 编辑

Contents

Introduction

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);


上面例子中,我们可以看到一个关键字foreach, 这是一个Qt中独有的,如果你想顺序遍历一个容器的所有元素,那么你就可以使用这个关键字,比如,"foreach (const QString &str, map.keys())"。

相关链接

This page was last modified on 11 October 2012, at 01:18.
390 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×