概述
说起顺序容器就不得不说说 list(链表)和 vector(数组)。
链表
链表是一种在内存中非连续的存储结构,元素的逻辑顺序是通过链表中的指针链接次序实现的。每一个元素都包括两个值:自身数据 + 下一个元素的地址(指针)。Qt 库封装链表的类是 QList。
这种结构在插入的时候可以达到O(1)的复杂度,也就是在任何位置插入一个新元素所执行的时间是固定的。举个例子,假如我在元素2和元素3中间插入一个新元素n,无非就是把元素2和元素3之间的链子砍断,然后重新设置指向而已。这种结构可以克服需要预先知道数据大小的缺点,还可以充分利用计算机内存空间(因为不需要一块连续的内存空间嘛),实现灵活的内存动态管理。缺点就是查找某个元素会特别耗时,它不像数组那样内部用红黑树来查找。
数组
数组我们都非常熟悉,数据在内存中是连续分布的。这种结构的缺点是当元素很多时,除了在结尾添加一个新元素以及修改某个元素值之外,其他相关的函数(如最开头插入)执行起来会随元素增多而变慢。因为主要是保证是占用连续的内存空间,因此插入新元素后,后面的元素都要顺次往后移动。Qt 库封装数组的类是 QVector。
示例
我们用一个实例来看看是否是这样,如下图。每个元素(QDate)占用8字节空间,可以看到 list 中存储的元素在内存中的分布是杂乱无序的,而 vector 中的元素在内存中排列是连续的。