当前位置: 首页>开发笔记>正文

Qt中QList用法详解

Qt中QList用法详解

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():节点位置?
 

https://www.zydui.com/afa6bV28FBgU.html
>

相关文章:

  • 使用QT必须要用链表吗
  • query函数怎么用
  • qt快速编程指南
  • qt核心编程
  • qt应用程序架构
  • QT应用编程
  • QListWidget
  • Qt和服务端的区别
  • vscode搭建nodejs環境,關于VS code ESP-IDF 提示“loading ‘build.ninja‘: 系統找不到指定的文件” 的解決方案
  • 什么是應用軟件并舉例,16.應用舉例
  • 【面經】美團春招三輪面經分享~涵蓋眾多知識點
  • 2021年面試題目,面試題--新增
  • magic king怎么讀,magick++ 簡介
  • 微信怎么設置定時發送,朋友圈可以定時發送嗎?
  • can not connect to rpc service,RPC service
  • ftpserver安卓版,FTPServer
  • server u使用教程,Server-U
  • rpc服務器,RPC 和 Web Service 有什么區別?
  • rpc服務器,web service和rpc的區別
  • psexec
  • dhclient命令,hpe?3par命令行查看狀況腳本
  • hp存儲默認管理口地址,HP3par 多路徑存儲磁盤使用方法
  • hp3par命令行手冊,3par命令集
  • 存儲器芯片的地址范圍,存儲器芯片類別有哪些?
  • 在pc機中各類存儲器,1.14各類存儲器芯片
  • 存儲芯片漲價最新消息,存儲器芯片
  • Windows/Linux性能監控軟件>csv文件,方便生成圖表
  • sqlserver nvarchar,【SQL開發實戰技巧】系列(四十五):Oracle12C常用新特性?VARCHAR2/NVARCHAR2類型最大長度由40
  • arcgis怎么導入地圖,Arcgis路網導入3dmax批量改成道路面
  • 定義animal父類,定義一個父類Animal eat方法 , 定義兩個子類 Dog 特有方法keepHome , Cat 特有方法 catchMouse ;并
  • 手機連接兩個藍牙方法,打開藍牙的設置
  • iconfont圖標免費嗎,關于阿里矢量圖標彩色icon使用
  • ps制作賽博朋克風格,如何用ps做出賽博朋克的風格?
  • ue4綠幕實時導入場景,如何在UE4中制作賽博朋克LED效果
  • 產品經理有哪些培訓課程,2023年全國NPDP產品經理國際認證火熱招生啦
  • B端產品需要什么能力,NPDP認證|B端產品經理是如何做競品調研的?
  • 超級工具,Supershell 一款牛叉閃閃的工具
  • buffer在c語言中是什么意思,QBuffer 用法理解