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

上面例子中,我们可以看到一个关键字foreach, 这是一个Qt中独有的,如果你想顺序遍历一个容器的所有元素,那么你就可以使用这个关键字,比如,"foreach (const QString &str, map.keys())"。
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值