当前位置: 代码迷 >> 综合 >> QT容器详解(一)——QList
  详细解决方案

QT容器详解(一)——QList

热度:19   发布时间:2023-12-05 18:09:40.0

一:QList

1.介绍

QList两种存储方式:

1)元素占用空间<指针占用空间(sizeof(T)<sizeof(void*)),并且元素已经使用Q_DECLARE_TYPEINFO声明为 Q_MOVABLE_TYPE 或 Q_PRIMITIVE_TYPE 时,QList以数组形式存储,QVector、QVarLengthArray一样;

2)元素占用空间>指针占用空间时,QList会将每个元素new到堆上,即 QList<T> 表示为 QList<T*> 的数组;

QList 容器在其生命周期内只会变大不会缩小,只有分配给另一个 QList 时析构函数和赋值运算符才会释放多余的空间。

2.基本操作

1> QList添加数据

/********添加数据**********/
QList<QString> list;//支持<<直接添加数据
list << "11" << "22";//11,22//insert任意位置插入数据
list.insert(1, "33");//11,33,22
list.insert(list.end(), "44");//11,33,22,44//append尾部添加数据
list.append("55");//11,33,22,44,55//prepend头部添加数据
list.prepend("66");//66,11,33,22,44,55//索引赋值,赋值操作不能超出索引范围
list[0] = "00";

2> QList查询数据

/********查询数据**********///支持索引访问
QString str = list[0];//66
for (int i = 0; i < list.size(); i++)
{qDebug() << list[i];
}//读写迭代器
QList<QString>::iterator it = list.begin();
for (; it < list.end(); it++)
{qDebug() << *it;
}//只读迭代器
QList<QString>::ConstIterator conit = list.begin();
for (; conit < list.end(); conit++)
{qDebug() << *conit;
}//QListIterator
QListIterator<QString> iterQ(list);
while (iterQ.hasNext())
{qDebug() << iterQ.next();//正向遍历
}
while (iterQ.hasPrevious())
{qDebug() << iterQ.previous();//反向遍历
}//QMutableListIterator可变迭代器
QMutableListIterator<QString> iterM(list);
while (iterM.hasNext())
{if (iterM.next() == "55"){//操作list}
}
iterM.toFront();//返回操作list后头部
while (iterM.hasNext())
{qDebug() << iterM.next();
}//只读访问优先使用at读取数据,相较于[]操作符速度更快,不用进行深拷贝
str = list.at(0);

3> QList删除数据

//仅删除
list.removeAt(0);
list.removeFirst();
list.removeLast();
list.removeAll("00");//删除并返回
list.takeAt(1);
list.takeFirst();
list.takeLast();

4> QList常用

list.indexOf("11", 0);//从索引0开始,返回11的索引
list.contains("11");//是否包含11
list.replace(0, "qq");//替换
list.swap(1, 2);//交换