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