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

相关推荐
炸膛坦客20 小时前
单片机开发工具篇:(十四)配置输出 .map 文件及其本地路径
c语言·单片机·嵌入式硬件
笨笨饿21 小时前
140_AI新手村MCP与Skills是干嘛的
开发语言·人工智能·python·stm32·单片机·嵌入式硬件·物联网
hahaha60161 天前
色彩恒常性概述
人工智能·嵌入式硬件·数码相机·计算机视觉
我叫洋洋1 天前
Cadence CIS 元器件库合并实战:3000+ 焊盘、156 个符号零冲突并入自有库
数据库·单片机·嵌入式硬件·oracle·电路
C++ 老炮儿的技术栈1 天前
main函数之后的调用
c语言·c++·人工智能·qt·mfc·c
hahaha60161 天前
Shades-of-Gray (SoG) 算法--白平衡算法
人工智能·嵌入式硬件·算法·计算机视觉
ebiobiz1 天前
极海 APM32 使用 Nimmake 编译指南
c++·python·单片机·嵌入式硬件·mcu
小神兵1 天前
对电压源与电流源的的简单理解
单片机·嵌入式硬件·物联网
comyccccc1 天前
三极管与MOS管工作原理全解析学习笔记
单片机·嵌入式硬件
FPGA小徐1 天前
运放电路:负载必须接地时,如何做电流采样(浮地负载 vs 接地负载)
单片机·嵌入式硬件