3.5 列表类QList
QList类以列表形态存储并管理其中的列表元素,并支持基于快速索引的数据存取,也可以进行快速的数据删除操作。QList类对象表示为一组指向被存储元素的数组。元素个数小于1000的QList类对象能够实现在链表中间的快速插入和查找操作。此外,由于QList类在链表两端都预先分配了内存,因此实现链表前后端的添加操作都很快(这两个成员函数为prepend()和append())。
QList是一种表示链表的模板类,是Qt的一种泛型容器类。它以链表方式存储一组数据(即列表中的元素),并能对这组数据进行快速索引,同时提供了快速插入和删除等操作。
QList类、QLinkedList类和QVector类提供的操作极其相似。对大多数操作来说,我们用QList类就可以了。QList类的成员函数是基于索引来实现的,因此用起来比QLinkedList类更方便(QLinkedList类的成员函数是基于迭代器来实现的)。QList类比QVector类更快,这是由它们在内存中的存储方式所决定的。
注意
对于尺寸比指针大的共享类,使用QVector类会更好。
QList类提供了一系列添加、移动、删除元素操作的成员函数:insert()、replace()、removeAt()、swap()。此外,它还提供了一些便于操作的成员函数:append()、prepend()、removeFirst()、removeLast()。
1. 初始化
QList类以链表形式存储一组元素,默认时为空链表,可以使用<<操作符添加元素:
QList<QString> list; list << "one" << "two" << "three"; // list: ["one", "two", "three"]
2. 访问元素
QList类与C++中数组的索引方式一样,索引值都是从0开始的。我们可以使用[]操作符来访问位于某个索引值处的元素。对于非const链表,操作符[]返回的是该元素的引用,并且返回值可以用于左操作数。比如:
if ( list[0] == "Bob" ) list[0] = "Robert";
QList类是以指针数组的形式实现的,因此操作速度很快(时间复杂度为常数)。对于列表中元素的只读访问,可以调用at()函数:
at()的执行速度比操作符[]更快,因为它不需要执行深度复制。
3. 插入操作
成员函数insert()在索引值指定的位置后插入值。函数的原型声明如下:
void QList::insert(int i, const T &value);
其中,参数i表示索引;value表示插入值。比如:
QList<QString> list; list << "alpha" << "beta" << "delta"; list.insert(2, "gamma"); // list: ["alpha", "beta", "gamma", "delta"]
4. 替换操作
成员函数replace()替换索引值指定位置处的值。函数的原型声明如下:
void QList::replace(int i, const T &value);
其中,参数i表示索引;value表示替换值。比如:
QList<QString> list; list << "alpha" << "beta" << "delta"; list.replace(2, "aaa"); // list: ["alpha", "beta", "aaa"]
5. 移除操作
成员函数removeAt()用于移除索引值指定位置处的值,该函数的原型声明如下:
void QList::removeAt(int i);
其中,参数i表示索引。
6. 移动操作
成员函数move()从某个索引值指定的位置移动到另外一个索引值指定的位置,该函数的原型声明如下:
void QList::move(int from, int to);
其中,参数from表示源位置;to表示目的位置。比如:
QList<QString> list; list << "A" << "B" << "C" << "D" << "E" << "F"; list.move(1, 4); // list: ["A", "C", "D", "E", "B", "F"]
7. 交换操作
成员函数swap()用于对两个索引值指定位置的元素进行交换,该函数的原型声明如下:
void swap(int i, int j);
其中,参数i和j是要交换的两个元素所在位置对应的索引值。比如:
QList<QString> list; list << "A" << "B" << "C" << "D" << "E" << "F"; list.swap(1, 4); // list: ["A", "E", "C", "D", "B", "F"]
8. 在列表尾添加元素
成员函数append()在列表的末尾插入元素,该函数的原型声明如下:
void append(const T &value);
其中,参数T是要在列表尾部插入的元素值。比如:
QList<QString> list; list.append("one"); list.append("two"); list.append("three"); // list: ["one", "two", "three"]
9. 在表头添加元素
成员函数prepend()在列表的头部插入元素值,该函数的原型声明如下:
void QList::prepend(const T &value);
其中,参数T表示要在列表的开头插入的元素值。比如:
QList<QString> list; list.prepend("one"); list.prepend("two"); list.prepend("three"); // list: ["three", "two", "one"]
10. 移除第一个元素
成员函数removeFirst()用于删除列表中的第一个元素,该函数的原型声明如下:
void removeFirst();
11. 移除最后一个元素
成员函数removeLast()用于删除列表中的最后一个元素,该函数的原型声明如下:
void removeLast();
12. 获得列表中第一个匹配元素值对应的索引位置
成员函数indexOf()用于返回列表中第一个匹配元素值对应的索引位置,该函数的原型声明如下:
int QList::indexOf(const T &value, int from = 0);
其中,参数value表示需要查询的元素值;from表示在列表中第几次匹配的元素值。比如:
13. 判断列表中是否有相应的元素值
成员函数contains()用于判断是否有相应的元素值,该函数的原型声明如下:
bool contains(const T &value);
如果该列表包含指定值的匹配元素,则返回true,否则返回false。
14. 获取指定值在列表中出现的次数
成员函数count()返回列表中与指定值匹配的元素数量,该函数的原型声明如下:
int count(const T &value);
参数T表示用于匹配的指定值。
15. 获取列表中元素的数量
成员函数count()返回列表中元素的数量,该函数的原型声明如下:
int count();
注意,用于返回列表元素数量时,调用count()函数时就不用带参数。