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

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

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

下面实操说明:

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

#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如果用指针表示的话就可以通过指针直接修改它的内容。如下:

#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();
}

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

#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);

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

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

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

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

最下面的代码段

#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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值