Qt容器类的对象模型及应用(线性结构篇)(好多图,比较清楚)
用Qt做过项目开发的人,肯定使用过诸如QList、QVector、QLinkList这样的模板容器类,它们虽然名字长的不同,但使用方法都大致相同, 因为其使用方法都大体相同,很多人可能随便拿一个容器类来使用,但却不知道这种选择是不是最优,这对于对性能要求不苛刻的应用,这种选择不会有任何影响,但是若性能要求苛刻的应用,无疑直接影响到你的系统的成败。上述提及的容器类本质上是对数据结构中的线性结构的不同的实现,本文通过介绍各容器类的实现原理,让我们知道什么时候该用什么样的容器,让大家不再感到迷茫。
1.QList的对象模型
一个QList 的对象模型如上图,ref表示该对象的引用计数,方便对对象释放,因为当通过append,insert等向对象添加项时,会通过new的方式从堆中分配内存来保存添加的项,若项数据不超过4个字节(即array中能存储下项数据),则最多只需new一次,如果有未存放项的array,则不需要new;若项数据超过4字节,因为array中存储不下超过4个字节的数据,所以至少要new一次,以存放数据项(如上图中的用户数据),当array中的所有项都已使用,这时需要再new一次,以增加array的空间大小,注意这里的array空间是连续的,所以重新分配空间后,需要将原来的空间的内容拷贝到新分配的空间中,并delete到原来的内存空间。上图中的 alloc表示分配的array的尺寸, array[begin]~array[end],表示使用的array,由此我们可以算出,QList的项个数,size() = end - begin + 1。
sharable表是该对象是否共享,在做对象拷贝的时候需要用到,比如有两个QList对象,list1 = list2;将list2赋值给list1,如果sharable为true,则仅将list2的对象指针直接赋值给list1的对象指针,这样的话,当我对list1操作时,实际上是对list2操作,因为两个对象都指向同一块内存,若sharable为false,则list1会首先分配一个和list2一样大小的内存,再把list2的内容拷贝到新分配的内存。
对于QList来说,sharable默认是false的,但对于接下来讲的QVector来说,sharable默认是true,所以QVector对象在做拷贝的时候,对象之间会共用同一个对象内存,这个要注意。
2.QVector的对象模型
QVector与QList的主要区别是QVector直接把要添加的数据项直接放到数组中,不管数据项有多大,它的空间是都是连续的,若数据项尺寸不超过1个指针长,QList与QVector没有什么区别,唯一的区别就是QList采用双向索引(begin和end),这样向前添加和向后添加项的时间复杂度是等同的。因为new操作是比较耗时的,使用QVector的resize事先分配若干空间,这样在append的时候,就不会再new空间了,也省去了空间拷贝的开销。
3.QLinkList的对象模型
QList、QVector是线性结构中的线性表结构,QLinkList的是线性结构中的链表结构,如上图,QLinkList的对象模型实际上是一个双向循环链表(图中循环没有画出来),红色色部分是链表头,包含有链表的尺寸,是否共享,及引用计数信息。对于每一次append操作,都会new出一个节点(图黑色部分)。
4.QVarLengthArray对象模型
5.由QList、QVector派生的对象
http://blog.csdn.net/rabinsong/article/details/9374213
Qt容器类的对象模型及应用(线性结构篇)(好多图,比较清楚)的更多相关文章
- Qt容器类的对象模型及应用(线性结构篇:对于QList来说,sharable默认是false的,但对于接下来讲的QVector来说,sharable默认是true)
用Qt做过项目开发的人,肯定使用过诸如QList.QVector.QLinkList这样的模板容器类,它们虽然名字长的不同,但使用方法都大致相同, 因为其使用方法都大体相同,很多人可能随便拿一个容器类 ...
- Qt——容器类(译)
注:本文是我对Qt官方文档的翻译,错误之处还请指正. 原文链接:Container Classes 介绍 Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项.比如,你需要一个大小可变 ...
- Qt容器类之一:Qt的容器类介绍
一.介绍 Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项.比如,你需要一个大小可变的QString的数组,则使用QVector<QString>. 这些容器类比STL ...
- Qt容器类汇总说明
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt容器类汇总说明 本文地址:http://techieliang.com/2017/ ...
- Qt容器类之二:迭代器
一.介绍 遍历一个容器可以使用迭代器(iterators)来完成,迭代器提供了一个统一的方法来访问容器中的项目.Qt的容器类提供了两种类型的迭代器:Java风格迭代器和STL风格迭代器.如果只是想按顺 ...
- Qt 中的对象模型(Object Model)
原标题:Qt 中的对象模型(Object Model)90不太后,余生皆折腾 本节内容主要讲了 Qt 对象模型比标准 C++ 对象模型多了什么内容,并介绍了组成 Qt 对象模型基础的相关的类.最后说明 ...
- Qt容器类之三:通用算法
在<QtAlgorithm>头文件中,Qt提供了一些全局的模板函数,这些函数是可以使用在容器上的十分常用的算法.我们可以在任何提供了STL风格迭代器的容器类上用这些算法,包括QList.Q ...
- Qt容器类——1. QList类、QLinkedList类和QVector类
在开发一个较高性能需求的应用程序时,程序员会比较关注这些容器类的运行效率,表2.1列出了QList.QLinkedList和QVector容器的时间复杂度比较. 1.QList类 QList<T ...
- Qt容器类(总结)(新发现的QQueue和QStack,注意全都是泛型)
Introduction Qt库提供了一组基于模板的一般化的容器类.这些容器可以存储指定的类型的元素.例如,如果你需要一个可变大小的Qstring数组,可以用QVector<QString> ...
随机推荐
- 在查询用户的权限的时候 使用左外连接 和 access数据库中左外连接
一般做视图最好是做成左外连接的.而其作用尤其在我们查询用户当前的权限时尤为明显,我们将 权限表即模块表放→角色权限表→角色表→用户角色表→用户表 就这样left outer join 连接起来,这样就 ...
- powerdesigner反向MySQL5.1数据库 生成ER图
我用的powerdesigner是15.1版本,数据库是MySQL5.1.57 (1)首先新建一个“PhysicalDataModel”类型的文件,然后点击“Database”->"C ...
- 认识jeecms开源项目
1. JEECMS源代码基本结构及相关技术简介: 参考:http://blog.csdn.net/caozhenyu/article/details/47005623
- “Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象
目录: “Zhuang.Data”轻型数据库访问框架(一)开篇介绍 “Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象 先来看一段代码 DbAccessor dba ...
- JavaSE复习日记 : 接口
/* * 接口 * 引用数据类型: * 类,接口,数组; * * 接口是一种引用数据类型,可以看作是一个特殊的类,它存在的目的是为了解决没有多重继承引起的功能弱的问题而设计的,一个类只能有一个父类,但 ...
- MVC打开电脑对话框
//下载文件 public ActionResult Download(int id) { //依靠模板生成文档 var path =要下载的文件的路径 var name = Path.GetFile ...
- springmvc中关于静态资源的放行
参考:http://blog.csdn.net/fujiakai/article/details/52504525 方法1. 修改web.xml文件,增加对静态资源的url映射,要加在org.spri ...
- JavaScript之转义字符
<html lang="en"> <head> <meta charset="UTF-8"> <meta na ...
- call和apply方法的理解
第一种:直接先来个粟子吧... ; } var child = {}; console.log(child); //Object() 对象 Parent.call(child); console. ...
- mysql-connector-c 安装
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr/local make make install