QList和QVector基本用法一样
QList<T> list 和QList<T*>list
T可以是数据类型或者指针(类指针)
定义一个数据结构体
typedef struct student
{
int id;
QString name;
QString sex;
int age;
QString des;
}student;
或者定义一个类
class Facility : public QObject
{
Q_OBJECT
public:
explicit Facility(QObject *parent = nullptr);
QString name;
signals:
public slots:
}
1、创建QList
(1)T为非指针的数据结构
QList<student> SList;
//非指针
for (int i=0;i<10;i++) {
student s1;
s1.id=i;
s1.name = "哇哈哈"+tr("%1").arg(i);
s1.age=10+i;
SList.append(s1);
}
(2) T为指针类型
QList<Facility *> flist;
Facility *P = new Facility();
P->name = "哈哈哈";
flist.push_back(P);
Facility *P1 = new Facility();
P1->name = "大神把";
flist.push_back(P1);
2、添加、插入
void append(const T&value) 在QList尾部插入value
void append(const TQList<T>&value) 在QList尾部插入QList<T>&value
void insert ( int i, const T & value ) 在QList其中某个位置插入value,假如没 声明i ,i 默认size()及在最后插入value
iterator insert ( iterator before, const T & value ) 在迭代器的前个位置插入value并返回当前迭代器的位置
3、修改值
QList.at(i) 不能修改值
(1)、可以用下标修改值,然后replace
for (int i=0;i<SList.size();i++) {
if (SList[i].id%2) {
SList[i].id=SList[i].id*-1;
SList.replace(i,SList[i]);
}
}
(2)、用迭代器修改值
QList<student *>::iterator i;
for (i = SList.begin();i!=SList.end();) {
if ((*i)->id%2) {
(*i)->id=(*i)->id*(-1);
}
++i;
}
4、删除item (一般使用迭代器)
注意内存泄露
不要在foreach里面进行元素的remove/add操作,remove请使用Iterator方式
(1)T非指针,直接removeOne或erase 全部删除用clear
(2)指针类型的,必须先delete *i 然后removeOne或erase
全部删除QList先删除指针内存再删除item 可以使用qDeleteAll(flist);flist.clear();
使用迭代器删除item时注意下标
QList<Facility *>::iterator i=flist.begin();
for (;i!=flist.end();++i) {
if ((*i)->name.contains("大")) {
(*i)->name = (*i)->name.replace("大","小");
delete *i; //指针需要删除内存
flist.removeOne(*i);
// flist.erase(i);
i--; // 注意i的位置要回退一位
}
}
5、排序
使用qSort函数
bool compareData(const student &infoA, const student &infoB)
{
return infoA.id < infoB.id;
}
qSort(SList.begin(),SList.end(),compareData);//按id排序
或者冒泡排序
//冒泡排序
for (int i=0;i<SList.size();i++) {
for (int j=i+1;j<SList.size();j++) {
if (SList[j].id>SList[i].id)//互换
{
student temp;
temp = SList[i];
SList[i]=SList[j];
SList[j]=temp;
}
}
}