Qt中QList用法详解

64 篇文章 10 订阅

QList 列表指针的 释放

1,使用qDeleteAll()

    QList<T*> list;

    qDeleteAll(list);

    list = NULL;

    QList<T*> *listp;

    qDeleteAll(*list);

    listp->clear();

    listp = NULL;

2.通过遍历列表对列表一个一个的释放。

在释放指针的同时把值清空,赋值为BULL 避免野指针。

QList<T *> *qList = new QList<T *>  动态分配内存空间 不使用时需要释放

T *t = new T;

qList->append(t);

           QList<t*>::iterator item = qList->begin();

            while(item != qList->end())
            {
                qList->removeOne(*item);
                T *index = (T*)*item;
                delete index;
                index = NULL;
                item++;
                qDebug()<< "dhsahdlhlas lish" << qList->length();
            }
            qList->clear();
            qList = NULL;

/****************************************************************

1、QList是一种表示链表的模板类。

2、QList是Qt的一种泛型容器类。它以链表方式存储一组值,并能对这组数据进行快速索引,还提供了快速插入和删除等操作。

3、QList、QLinkedList和QVector提供的操作极其相似:
* 对大多数操作来说,我们用QList就可以了。其API是基于索引(index)的,因此用起来比QLinkedList更方便(QLinkedList的API是基于迭代器的)。QList比QVector更快,这是由它们在内存中的存储方式决定的。
* 需要使用QLinkedList的地方:
* 需要使用QVector的地方:元素的储存位置彼此相邻。

4、QList表示为一组指向被存储元素的数组。(例外,如果T本身就是指针类型,或者是size不大于指针类型的基本类型,或者是Qt的共享类,那么QList会直接在指针数组中存储这些元素 。)元素个数小于1000的QList能够很快地实现在链表中间插入操作,以及快速的查找操作。此
外,由于QList在链表两端都预先分配了内存,因此实现prepend()和append()操作都很快。
注意:对于size比指针大的共享类,使用QVector会更好。

5、以下是两个分别存储int型数据和QDate类型数据的链表:
QList intList;
QList dateList;

6、QList以链表形式存储一组元素。默认为空链表,我们可以使用<<操作符添加元素:
QList list;
list << “one” << “two” << “three”; // list: [“one”, “two”, “three”]

7、QList提供了一系列添加、移动、删除元素的操作:insert(), replace(), removeAt(), swap()。此外,它还提供了便于操作的函数:append(), prepend(), removeFirst(), removeLast()。

8、QList与C++中数组的索引方式一样,都是从0开始的。我们可以使用[]操作符来访问位于索引值
处的元素。对于非const链表,操作符[]返回的是该元素的引用,并且返回值可以用途左操作数。
if ( list[0] == “Bob” )
list[0] = “Robert”;
由于QList是以指针数组的形式实现的,该操作能够很快地实现(时间复杂度为常数)。对于只读访问,我们可以用at()函数实现访问:
for ( int i=0; i!=list.size(); ++i )
{
if ( list.at(i) == “Jane” )
{ cout << “Found Jane at position:” << i<< endl;}
}
at()操作比操作符[]更快,因为它不需要深度复制(deep copy)。

9、QList的一个常用操作是,从链表中取出一个元素(元素不再在链表之中),并对该元素进行操作。QList提供了以下操作来实现此功能:
takeAt()、takeFirst()、takeLast()。以下是一个示例:
QList
/*****************************************************************

QList使用总结
概述
一、QList 声明及初始化
1. 声明 QList
2. 初始化 QList
二、QList 基本的 增加、删除、移动、修改
1. 增加节点
2. 删除节点
3. 移动节点
4. 修改节点值
三、QList 定位节点
四、QList 的基本信息
五、QList 迭代器功能
概述
QList是Qt的泛型容器类之一。它将项目存储在一个列表中,该列表提供基于索引的快速访问以及基于索引的插入和删除。
QList、QLinkedList 和 QVector 提供了类似的 API 和功能。它们通常是可互换的,但性能有所区别。

QVector 应该是默认首选的容器
QList是最广泛用于Qt API中传递值的容器
QList不是指针结构体类型的链表,真正的结构体指针链表是 QLinkedList
一、QList 声明及初始化
QList可以保存基本数据类型的,如int,double,bool等;但是在存储QObject对象及其子类对象时,不能直接存对象本身,而是只能存对象的地址;

1. 声明 QList
声明简单:

//基本数据类型
QList<int> integerList;
QList<QDate> dateList;

//存储QObject对象的地址
QList <QWidget *> ptr_widgets;
QList <QObject *> ptr_objects;

2. 初始化 QList
初始化也很简单;若没初始化,链表默认为空的。

QList<QString> list = { "one", "two", "three" };

QWidget * widget1 = new QWidget();
QWidget * widget2 = new QWidget();
QList<QWidget *> ptr_widgets = {widget1, widget2};

二、QList 基本的 增加、删除、移动、修改
QList 在有些实现都是需要多个基本操作组合来实现的,不同的实现用的方法也不一致,Qt提供的都是最核心、最单一的功能。

1. 增加节点
insert():插入节点到
append():尾部添加节点
prepend() :头部添加节点
operator <<():尾部添加节点或链表
operator+=():尾部添加节点
2. 删除节点
removeAt():删除节点
removeFirst():删除头节点
removeLast():删除尾节点
3. 移动节点
move():链表内移动节点位置
swap():俩个链表交换值(其实交换一下地址映射就能实现)
4. 修改节点值
replace():替换链表内的节点值
三、QList 定位节点
QList是有序的链表,可以通过索引来得到

operator [ ] 数组索引符:这个和普通数组一样的使用 [ ] 访问下标方法一致
at() 函数:也是通过索引值,也即是下标方式
Qt 推荐使用at()函数,这样的效率更好,因为 at()函数不会发生 深拷贝 ,而另外一种方式会。

QList还提供了一些快捷的 索引 + 返回索引节点 + 删除原索引节点,也就是组合的功能;但是这个是 take…不是get…这样的,这就意味着,这个其实是✂剪掉一个节点,并返回

takeAt():取得在指定位置的节点
takeFirst():取得头节点 ;等价【takeAt(0)】
takeLast():取得尾节点
四、QList 的基本信息
contains():是否包含节点xxx
count():对指定节点值计数
isEmpty():链表为空?
size():链表大小?
indexOf():节点位置?
 

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值