Qt 中的顺序容器:QList、QVector的异同

概述

说起顺序容器就不得不说说 list(链表)和 vector(数组)。

链表

链表是一种在内存中非连续的存储结构,元素的逻辑顺序是通过链表中的指针链接次序实现的。每一个元素都包括两个值:自身数据 + 下一个元素的地址(指针)。Qt 库封装链表的类是 QList。
在这里插入图片描述
这种结构在插入的时候可以达到O(1)的复杂度,也就是在任何位置插入一个新元素所执行的时间是固定的。举个例子,假如我在元素2和元素3中间插入一个新元素n,无非就是把元素2和元素3之间的链子砍断,然后重新设置指向而已。这种结构可以克服需要预先知道数据大小的缺点,还可以充分利用计算机内存空间(因为不需要一块连续的内存空间嘛),实现灵活的内存动态管理。缺点就是查找某个元素会特别耗时,它不像数组那样内部用红黑树来查找。
在这里插入图片描述

数组

数组我们都非常熟悉,数据在内存中是连续分布的。这种结构的缺点是当元素很多时,除了在结尾添加一个新元素以及修改某个元素值之外,其他相关的函数(如最开头插入)执行起来会随元素增多而变慢。因为主要是保证是占用连续的内存空间,因此插入新元素后,后面的元素都要顺次往后移动。Qt 库封装数组的类是 QVector。
在这里插入图片描述

示例

我们用一个实例来看看是否是这样,如下图。每个元素(QDate)占用8字节空间,可以看到 list 中存储的元素在内存中的分布是杂乱无序的,而 vector 中的元素在内存中排列是连续的。
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值