Qt容器类的对象模型及应用(线性结构篇:对于QList来说,sharable默认是false的,但对于接下来讲的QVector来说,sharable默认是true)
用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派生的对象
https://blog.csdn.net/rabinsong/article/details/9374213
Qt容器类的对象模型及应用(线性结构篇:对于QList来说,sharable默认是false的,但对于接下来讲的QVector来说,sharable默认是true)的更多相关文章
- Qt容器类的对象模型及应用(线性结构篇)(好多图,比较清楚)
用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> ...
随机推荐
- 框架,表格,表单元素,css基础以及基本标签的结合
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...
- HUST 1585 排队
2019-05-21 10:15:00 加油,加油 !!! #include <bits/stdc++.h> using namespace std; int main() { int n ...
- js编写时间选择框
效果图: 代码: 新建js:WdatePicker.js /* * My97 DatePicker 4.72 Release * License: http://www.my97.net/dp/lic ...
- 四.Windows I/O模型之重叠IO(overlapped)模型
1.适用于除Windows CE之外的各种Windows平台.在使用这个模型之前应该确保该系统安装了Winsock2.重叠模型的基本设计原理是使用一个重叠的数据结构,一次投递一个或多个Winsock ...
- 【Oracle】数据库热备
1. 创建脚本 注:脚本第三行中的DB_NAME,需要改为自己的数据库名(show parameter name;): oracle用户下新建目录:/home/oracle/DB_NAME/hot_b ...
- Warning:关于_CRT_SECURE_NO_WARNINGS
Warning 1 warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s in ...
- poj 2955 Brackets 【 区间dp 】
话说这题自己折腾好久还是没有推出转移的公式来啊------------------ 只想出了dp[i][j]表示i到j的最大括号匹配的数目--ค(TㅅT)------------------- 后来搜 ...
- TortoiseSvn问题研究(一)
问题描述 今天在工作中遇到一个SVN方面的问题,牵扯出使用SVN这一段时间的一系列问题. 具体来说,是这样的: 上周五有上线分支,自己的分支需要merge: 很多项目小组都在开发这个项目,再往前好像也 ...
- SPL类
用途:对类,方法,属性,参数的提取生成文档:自动加载插件 实列化类同于new:$ref = new ReflectionClass($classname);$class = $ref->newI ...
- vsftp进阶-锁定目录
把用户锁定到特定的目录下面: 一.配置文件: #grep -Ev "^#|^$" /etc/vsftpd/vsftpd.conf anonymous_enable=NOlocal_ ...