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

相关推荐
单片机仿真设计2 小时前
【proteus仿真】基于 STM32 单片机太阳能双轴追踪系统 Proteus 仿真设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·课设
万物智能信息科技2 小时前
板载按键key的ADC转换和信号控制—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
嵌入式硬件·华为·开源·harmonyos·鸿蒙
qq_402995754 小时前
MOS管的工作原理
嵌入式硬件·mcu
安河桥。5 小时前
座舱显示接口笔记:DP、eDP、无线投屏到底怎么分工?
嵌入式硬件·车载系统·音视频·视频
辰域电子5 小时前
STM32项目开源:粮仓环境安防监测系统(代码 + 原理图 + 仿真)
stm32·单片机·嵌入式硬件·开源·毕业设计·proteus
朽棘不雕5 小时前
Qt项目代码解释
开发语言·qt
mitugaoyang19936 小时前
Marvell88Q5152交换机开发(5)-烧录和调试
网络·嵌入式硬件·网络通信
AAA代码批发商6 小时前
DAYS41 UART 串口通信 + DS18B20 单总线温度传感器
嵌入式硬件·51单片机
CVer儿6 小时前
vs2022配置qt
开发语言·qt