QT 容器 QList,QLinkedList,QVector,QMap,QHash优缺点,与使用范围

本文详细介绍了QT中的各种容器,包括顺序容器QList, QLinkedList, QVector, QStack, QQueue和关联容器QMap, QMultiMap, QHash, QMultiHash, QSet。讨论了它们的特性,如隐式共享、迭代器类型、算法复杂度和增长策略。QT容器支持Java风格和STL风格迭代器,其中STL风格在效率上有优势。文章还提到了容器中值类型的限制,如要求类型具有复制构造函数和赋值运算符。此外,还分析了隐式共享的优缺点,提醒在使用STL风格迭代器时需注意容器的复制问题。" 95011811,7294788,Kafka序列化器深度解析:StringSerializer示例,"['Kafka', '序列化', '消息传递', '数据编码', 'Java']
摘要由CSDN通过智能技术生成

目录

一、前言:

二、QT 容器

2.1、简述

2.2、容器分类

1>、顺序容器:QList,QLinkedList,QVector,QStack 和 QQueue

2>、关联容器:QMap,QMultiMap,QHash,QMultiHash 和 QSet

2.3、QT 各容器简述

2.4、保存在 容器内的 值的类型 限制

1>、通用限制:

2>、个别容器 独有的限制:

三、 迭代器类

3.1、 Java 风格迭代器

1>、两种方法

2>、与 STL 风格迭代器不同①:

3>、与 STL 迭代器的不同②:

3.2、 STL 风格迭代器 - 比 Java 风格快

1>、两种方法:

2>、和 Java 风格迭代器不同

四、 隐式共享

4.1、优势:

4.2、劣势 - 可能出现错误

五、算法复杂度

5.1、线性容器类的算法复杂度

5.2、关联容器的算法复杂度

六、增长策略

6.1、各容器保存数据的方式:

6.2、增长方式

1>、QString 增长策略

2>、QVector 增长策略

3>、QHash 增长策略

4>、自定义调整 增长策略


一、前言:

如果想看 STL容器 的优缺点,请查看如下文章:

C++ STL容器 底层数据结构》  https://blog.csdn.net/LearnLHC/article/details/89552420?spm=1001.2014.3001.5502

c++ map、multimap 的使用方法》   https://blog.csdn.net/LearnLHC/article/details/89536774?spm=1001.2014.3001.5502

《QTL 容器 与 STL(1)- 写时复制》https://blog.csdn.net/LearnLHC/article/details/91983462

二、QT 容器

2.1、简述

这些类都是 隐式共享可重入

隐式共享:仅在被写入时才被拷贝;仅读数据时,多个变量共享一块空间

可重入:首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是可重入,可以允许有多个该函数的副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。反例:全局变量(如:static)

且针对几个方面做了优化:

一是速度,二是较低的内存占用,三是尽可能少的内联代码,减少生成程序的体积。

另外,在所有线程都以只读的方式访问容器时,这些类是线程安全的。

要遍历容器中的元素,你可以使用两种风格迭代器:

Java 风格迭代器和 STL 风格迭代器。

Java 风格迭代器有更好的易用性和更高级的函数,

而 STL 风格迭代器则在效率上会略有优势,并且可以用于 Qt 和 STL 提供的泛型算法中。

Qt 还提供了 foreach 关键字,可以方便地遍历容器。

2.2、容器分类

1>、顺序容器QListQLinkedListQVectorQStackQQueue

对于大多数的应用,QList 是最适用的。虽然其基于数组实现,但支持在头部和尾部快速插入。

如果确实需要一个基于链表的列表,你可以使用 QLinkedList

如果要求元素以连续内存的形式保存,那么可以使用 QVector

QStack QQueue提供了 LIFO 和 FIFO 语义的支持。

2>、关联容器QMapQMultiMapQHashQMultiHashQSet

"Multi" 容器可以方便地支持键值一对多的情形。

“Hash” 容器提供了快速查找的能力,这是通过使用哈希函数代替对有序集合进行二分查找实现的。

2.3、QT 各容器简述

综述
QList 这是目前使用最普遍的容器类,其保存了一个元素类型为T的列表,支持通过索引访问。QList 内部通过数组实现,以确保基于索引的访问足够快。
元素可以通过 QList::append()QList::prepend() 插入到首尾,也可以通过 QList::insert() 插入到列表中间,和其他容器类不同的是,QList 为生成尽可能少的代码做了高度优化。QStringList 继承于 QList<QString>。
QLinkedList) 这个类和 QList 很像,不同的是这个类使用迭代器进行而不是整形索引对元素进行访问。和 QList 相比,其在中间插入大型列表时其性能更优,而且其具有更好的迭代器语义。(在 QLinkedList 中,指向一个元素的迭代器只要该元素存在,则会一直保持有效,而在 QList 的迭代器则可能会在任意的元素插入或删除后失效。)
QVector 这个类以数组的形式保存给定类型的元素,在内存中元素彼此相邻。在一个 vector 的头部或中部插入可能会相当慢,因为这可能会导致大量元素需要在内存中移动一个位置。
QVarLengthArray<T, Prealloc> 这个类提供了一个底层的变长数组,在速度极其重要的情况下可以用来代替 QVector
QStack 这个类继承于 QVector,用于为”后进,先出”(LIFO )提供便捷的语义支持。其为 QVector 添加了以下方法:QVector::push()pop()top()
QQueue 这个类继承于
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值