Qt的常用类QList--序列数据管理

QList的主要作用是序列数据管理,常用的序列管理类还有QVector和QLinkList,一般情况下用QList就够了。

QList是最常用的容器模板类,它存储给定数据类型的一系列值,它所维护的是一个指针数组,该数组存储的指针指向存储列表内容的值,因此可以采用下标来进行索引进行快速的访问。它提供了快速插入和删除等操作。而QVector是Qt对所有数组的封装,它元素的存储位置彼此相邻,也就是说它是以数组的形式进行存储的,它的插入删除操作常常伴随着内存的移动,所以效率上并没有QList高。QlinkList我们可以把它当成一个链表,它以非连续的内存块进行保存数据,所以它不能使用下标进行访问,它更适合于数据的插入操作。

下面实操说明:

QList是序列数据管理的模板类,它的用法:

cpp 复制代码
#include <QCoreApplication>
#include <QList>
#include <QtDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QList<int> list;
    int i;

    //list<<11<<22<<33<<44;
    list.append(11);
    list.append(33);
    list.append(44);
    list.append(55);
    list.prepend(00);
    list.insert(2,22);

    list.removeLast();
    for(i=0;i<list.size();i++)
    {
        qDebug()<<"--------------->>>"<<list.at(i);
    }

    list.removeLast();
    list.removeFirst();
    list.removeAt(1);
    for(i=0;i<list.size();i++)
    {
        qDebug()<<"---------------"<<list.at(i);
    }

    return a.exec();
}

重点:

1.QList的定义:QList一个尖括号,中间可以表示我们的模板类型,这里是int类型,也可以是double类型,甚至可以是类QString,我们也可以把它定义为指针或者结构体,定义之后,可以用<<运算符将节点依次添加到list的数据管理当中,如果这种方式不习惯,还可以使用list.append(11);依次添加,通过size()这个函数得到节点的个数,在最后通过at()函数得到list节点的数据。

2.QList插入数据的最常用的函数:append表示添加到QList节点的尾部,prepend表示添加到节点的头部,从中间插入数据使用insert(位置,数据),删除最后一个元素用removeLast(),删除第一个元素removeFirst(),删除指定位置的元素removeAt(下标)

通常在项目中QList一般都是用来表示复杂对象的一个集合管理,

QList如果用指针表示的话就可以通过指针直接修改它的内容。如下:

cpp 复制代码
#include <QCoreApplication>
#include <QList>
#include <QtDebug>

typedef struct
{
    int age;
    QString name;
}Student;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QList<Student *> list;

    Student *snode;//定义一个结构体指针snode
    int i;
    for(i=0;i<3;i++)
    {
        snode = new Student;
        snode->age = 20+i;
        snode->name = QString("zs%1").arg(i+1);

        list.append(snode);
    }

    snode = list.at(1);//将snode指向下标为1的列表里
    snode->name = "lisi";//通过snode给列表里的值重新赋值
    snode->age = 18;

    for(i=0;i<list.size();i++)
    {
        qDebug()<<list.at(i)->name<<"---"<<list.at(i)->age;
    }

    qDeleteAll(list);//释放new创建的对象
    list.clear();//清空节点
    
    return a.exec();
}

不习惯用指针,直接用结构体也是可以的:

cpp 复制代码
#include <QCoreApplication>
#include <QList>
#include <QtDebug>

typedef struct
{
    int age;
    QString name;
}Student;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QList<Student> list;

    Student snode;//定义一个结构体指针snode
    int i;
    for(i=0;i<3;i++)
    {
        //snode = new Student;
        snode.age = 20+i;
        snode.name = QString("zs%1").arg(i+1);

        list.append(snode);
    }

    snode = list.at(1);//将snode指向下标为1的列表里
    snode.name = "lisi";//通过snode给列表里的值重新赋值
    snode.age = 18;

    //list.replace(1,snode);//解除注释可实现修改内容

    for(i=0;i<list.size();i++)
    {
        qDebug()<<list.at(i).name<<"---"<<list.at(i).age;
    }

    //qDeleteAll(list);//释放new创建的对象
    list.clear();//清空节点

    return a.exec();
}

结果显示第二个内容并没有被修改。

那么我们怎么才能在使用结构体情境下修改下标1的内容呢?

list.replace(1,snode);

有时我们想要实现同时删除这个数据的时候又得到这个数据(汇总到最下面那个代码段):

list0也可以通过下标来访问数据,不推荐使用,效率不高。什么原因?list是一个指针数组,表示每个节点,所以我们才可以通过下标得到它的数据。通过list.at()函数和下标,它的区别就是通过下标的时候,QList会对它的数据进行一次拷贝,也就是内存的一次复制,所以我们通过下标这种方式效率不高。

交换元素的数据(汇总到最下面那个代码段):

list(0,1);//交换标号0位置和1位置的数据

最下面的代码段:

cpp 复制代码
#include <QCoreApplication>
#include <QList>
#include <QtDebug>

typedef struct
{
    int age;
    QString name;
}Student;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QList<Student *> list;

    Student *snode;//定义一个结构体指针snode
    int i;
    for(i=0;i<3;i++)
    {
        snode = new Student;
        snode->age = 20+i;
        snode->name = QString("zs%1").arg(i+1);

        list.append(snode);
    }

    snode = list.at(1);//将snode指向下标为1的列表里
    snode->name = "lisi";//通过snode给列表里的值重新赋值
    snode->age = 18;

    for(i=0;i<list.size();i++)
    {
        qDebug()<<list.at(i)->name<<"---"<<list.at(i)->age;
    }

    snode = list.takeLast();
    qDebug()<<snode->name<<"---"<<snode->age;
    delete snode;

    list.swap(0,1);//交换两个位置的数据

    for(i=0;i<list.size();i++)
    {
        qDebug()<<list.at(i)->name<<"###"<<list.at(i)->age;
    }

    qDeleteAll(list);//释放new创建的对象
    list.clear();//清空节点

    return a.exec();
}

大家私下自行实验验证。

分享下视频学习链接: https://b23.tv/txGq60J

相关推荐
威嵌神州1 天前
嵌入式排故实录:高并发下串口数据“超时丢包”的根因剖析与架构优化
运维·服务器·嵌入式硬件·缓存
少司府1 天前
嵌入式入门篇(二):初识STM32F103ZET6
linux·python·stm32·单片机·嵌入式硬件·mcu·嵌入式软件
shimly1234561 天前
(done) 嵌入式硬件电路图 (8) 获取芯片手册信息
嵌入式硬件
简单电磁炮1 天前
FWD八位单片机调试问题
单片机·嵌入式硬件
ShineWinsu1 天前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
shimly1234561 天前
(done) 嵌入式硬件电路图 (6) 重要的元器件特性之MOS管
嵌入式硬件
菥蓂寻生2 天前
STM32移植到GD32中以105为例
stm32·单片机·嵌入式硬件
杯子不吃紫菜2 天前
LangGraph 体系实战(下):中断恢复、流式、子图与设计模式
单片机·嵌入式硬件·设计模式
qq_448011162 天前
中断服务函数简介
嵌入式硬件
Risehuxyc2 天前
STM32程序逻辑---入口函数逻辑和NVIC嵌套向量中断控制器初始化
stm32·单片机·嵌入式硬件