QVector、QList、QLinkedList 类

     QVector

是提供动态数组的一个模板类。在连续相邻的内存位置中存储items的值,并且提供基于索引(index-based)的快速访问。

 QList

是提供列表的一个模板类。不是在连续内存空间存储,以数组列表(array-list)形式实现,并基于索引访问(index-based),同时,它插入和删除元素比较快(constant time)。和std 的list 不等价.

底层实现:QList 和 std::list 的底层实现有很大不同。QList 是基于动态数组实现的,其内部元素在内存中是连续存储的。而 std::list 是基于双向链表实现的,其内部元素在内存中是分散存储的。

访问时间:由于底层实现的差异,QList 和 std::list 在访问元素时具有不同的时间复杂度。QList 可以在 O(1) 时间内访问任意位置的元素。而 std::list 访问某个特定元素需要 O(n) 的时间,其中 n 是链表中元素的数量。
插入和删除时间:QList 在尾部插入和删除元素时具有 O(1) 的时间复杂度,但在中间位置进行插入和删除操作时,可能需要 O(n) 的时间。而 std::list 的插入和删除操作时间复杂度总是 O(1),因为链表结构可以轻松地添加和删除节点。

QT各版本中QList的变化

Qt5 中的 QList:在 Qt5 中,QList 使用的是一个动态数组,它的内存分配是通过预先分配一定大小的内存块实现的。这种设计使得 QList 在许多用例中具有良好的性能,但在某些情况下(尤其是对于大型数据结构),QList 的性能可能不如 QVector。此外,Qt5 中的 QList 对于非指针类型或 QObject 派生类类型的对象,默认使用间接存储(即将对象存储在内存块之外的堆中)。
Qt6 中的 QList:在 Qt6 中,QList 的实现得到了重大改进。QList 现在使用 QVector 作为其内部存储实现。这使得 QList 在所有用例中的性能都与 QVector 接近。Qt6 中的 QList 不再使用间接存储,而是直接存储所有类型的对象,这可以减少内存碎片和提高性能。这些更改使得 QList 在 Qt6 中成为一个更通用、更高效的容器。

QList 列表指针的 释放
第一种办法:先使用qDeleteAll(),再调用clear().其实qDeleteAll就是对迭代delete的封装。

    QList<T*> list;

    qDeleteAll(list);

   list.clear();

   或者  QList<T*> *listp;

    qDeleteAll(*list);

    listp->clear();

    listp = NULL;

第二种办法:通过迭代遍历对列表一个一个的释放。

QList<T *> *qList = new QList<T *>  动态分配内存空间 不使用时需要释放
T *t = new T;
qList->append(t);
QList<t*>::iterator item = qList->begin();
 while(item != qList->end())
 {
    delete *item;
    item++;
 }
 qList->clear();
 qList = NULL;

  QLinkedList

是提供链表的一个模板类。以链式列表(linked-list)形式实现,不是连续的,并基于迭代器访问。相当于std 的 list

正常情况来说,QList是比较合适的选择,QList是基于索引访问(index-based)的API,它比QLinkedList {基于迭代器访问(iterator-based)的API}使用更加方便。

要连续的内存空间用QVector。

需要使用一个真正的链表用  QLinkedList 。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值