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()函数时就不用带参数。