Qt容器类介绍和使用

引言

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



你可能感兴趣的:(Qt容器类介绍和使用)