【QT基础入门】QT中的容器类:QList

QList简介

QList是QT中最通用的序列容器类,它可以用来存储和操作任意类型的数据。QList在内部实现为一个数组列表,它的每个元素都是一个指针,指向实际的数据对象。这样做的好处是,QList可以高效地在头部或尾部添加或删除元素,而不需要移动其他元素的内存位置。同时,QList也可以通过下标或迭代器访问元素,提供了随机访问的能力。

QList的特点是:

  • 灵活性:QList可以存储任意类型的数据,包括基本类型,QT自带的类型,自定义的类型,甚至是其他容器类型。QList可以自动识别数据的类型,进行相应的内存管理和拷贝操作。
  • 高效性:QList可以快速地在头部或尾部添加或删除元素,因为它只需要修改指针的值,而不需要移动其他元素的内存位置。QList也可以通过下标或迭代器访问元素,提供了随机访问的能力。
  • 兼容性:QList可以和标准库的容器类进行互操作,例如std::vector,std::list,std::deque等。QList也可以和QT的其他容器类进行互操作,例如QVector,QLinkedList,QStack,QQueue等。QList还可以和C风格的数组进行互操作,例如int\[\],char\[\]等。

QList的缺点是:

  • 空间开销:QList为了提高时间效率,牺牲了一些空间效率。QList在内部使用了一个指针数组,而不是直接存储数据对象。这样做的结果是,QList占用的内存空间会比实际的数据对象多一些。
  • 缓存不友好:QList由于使用了指针数组,导致它的元素可能不是连续存储的。这样做的结果是,QList在访问元素时,可能会导致缓存失效,降低性能。

QList适用的场景是:

  • 需要频繁地在头部或尾部添加或删除元素的情况:QList在这种情况下可以提供很高的效率,而不需要移动其他元素的内存位置。
  • 需要随机访问元素的情况:QList在这种情况下可以提供很高的效率,因为它可以通过下标或迭代器访问元素。
  • 不太关心空间开销和缓存效率的情况:QList在这种情况下可以提供很高的灵活性,因为它可以存储任意类型的数据,而不需要考虑内存管理和拷贝操作。
cpp 复制代码
#include <QList>
#include <QVariant>
#include <QString>
#include <QDebug>


    // 创建一个空的QList
    QList<int> list1;
    // 创建一个包含5个元素的QList
    QList<int> list2(5);
    // 创建一个包含3个元素的QList,并初始化为10
    QList<int> list3(3, 10);
    // 创建一个包含4个元素的QList,并使用列表初始化
    QList<int> list4{1, 2, 3, 4};
    // 创建一个包含3个元素的QList,并使用数组初始化
    int arr[] = {5, 6, 7};
    QList<int> list5 = QList<int>::fromArray(arr, 3);
    // 创建一个包含不同类型的元素的QList,并使用QVariant初始化
    QList<QVariant> list6;
    list6 << 1 << 3.14 << "Hello" << true;

    // 在QList的头部添加元素
    list1.prepend(0);
    // 在QList的尾部添加元素
    list1.append(9);
    // 在QList的中间插入元素
    list1.insert(1, 1);
    list1.insert(8, 8);

    // 删除QList的头部元素
    list1.removeFirst();
    // 删除QList的尾部元素
    list1.removeLast();
    // 删除QList的中间元素
    list1.removeAt(1);
    list1.removeAt(6);

    // 通过下标访问QList的元素
    qDebug() << "list1[0] =" << list1[0];
    qDebug() << "list1[1] =" << list1[1];
    // 通过at函数访问QList的元素
    qDebug() << "list1.at(0) =" << list1.at(0);
    qDebug() << "list1.at(1) =" << list1.at(1);
    // 通过value函数访问QList的元素,如果下标越界,返回默认值
    qDebug() << "list1.value(0) =" << list1.value(0);
    qDebug() << "list1.value(10) =" << list1.value(10);
    qDebug() << "list1.value(10, -1) =" << list1.value(10, -1);

    // 通过迭代器遍历QList的元素
    for (QList<int>::iterator it = list1.begin(); it != list1.end(); ++it)
    {
        qDebug() << *it;
    }
    // 通过常量迭代器遍历QList的元素
    for (QList<int>::const_iterator it = list1.constBegin(); it != list1.constEnd(); ++it)
    {
        qDebug() << *it;
    }
    // 通过反向迭代器遍历QList的元素
    for (QList<int>::reverse_iterator it = list1.rbegin(); it != list1.rend(); ++it)
    {
        qDebug() << *it;
    }
    // 通过常量反向迭代器遍历QList的元素
    for (QList<int>::const_reverse_iterator it = list1.crbegin(); it != list1.crend(); ++it)
    {
        qDebug() << *it;
    }
    // 通过范围for循环遍历QList的元素
    for (int x : list1)
    {
        qDebug() << x;
    }

    // 对QList的元素进行排序
    list1.sort();
    // 对QList的元素进行倒序
    list1.reverse();
    // 对QList的元素进行随机打乱
    list1.shuffle();

    // 查找QList中是否包含某个元素
    qDebug() << "list1.contains(3) =" << list1.contains(3);
    // 查找QList中某个元素的下标
    qDebug() << "list1.indexOf(3) =" << list1.indexOf(3);
    // 查找QList中某个元素的最后一个下标
    qDebug() << "list1.lastIndexOf(3) =" << list1.lastIndexOf(3);
    // 查找QList中某个元素的出现次数
    qDebug() << "list1.count(3) =" << list1.count(3);

    // 获取QList的元素个数
    qDebug() << "list1.size() =" << list1.size();
    // 获取QList的容量
    qDebug() << "list1.capacity() =" << list1.capacity();
    // 判断QList是否为空
    qDebug() << "list1.isEmpty() =" << list1.isEmpty();
    // 清空QList
    list1.clear();

    // 将QList转换为数组
    int *arr1 = list1.toArray();
    // 将QList转换为QVector
    QVector<int> vec1 = list1.toVector();
    // 将QList转换为QLinkedList
    QLinkedList<int> link1 = list1.toLinkedList();
    // 将QList转换为QSet
    QSet<int> set1 = list1.toSet();

    // 将QList的元素转换为QVariant
    QList<QVariant> var1 = list1.toVariantList();
    // 将QVariant的元素转换为QList
    QList<int> list7 = list6.toIntList();

QList的元素操作

  • append(value):在列表的末尾添加一个值或另一个列表。
  • prepend(value):在列表的开头添加一个值。
  • insert(i, value):在列表的指定位置i插入一个值或多个相同的值。
  • remove(i):从列表中删除指定位置i的值。
  • replace(i, value):用一个新值替换列表中指定位置i的值。
  • take(i):从列表中删除指定位置i的值,并返回该值。
  • swap(i, j):交换列表中指定位置i和j的值。
  • move(i, j):将列表中指定位置i的值移动到指定位置。
  • at(i):返回列表中指定位置i的值的常量引用。
  • operator:返回列表中指定位置i的值的引用。
  • value(i):返回列表中指定位置i的值,如果i超出范围,则返回一个默认构造的值2。
  • first():返回列表中第一个值的引用。
  • last():返回列表中最后一个值的引用。
  • front():返回列表中第一个值的引用,与first()等价。
  • back():返回列表中最后一个值的引用,与last()等价。
  • contains(value):判断列表中是否包含指定的值。
  • indexOf(value, from):返回列表中第一个出现的指定值的索引位置,从索引位置from开始向前搜索。
  • lastIndexOf(value, from):返回列表中最后一个出现的指定值的索引位置,从索引位置from开始向后搜索。
  • count(value):返回列表中指定值出现的次数。
  • isEmpty():判断列表是否为空。
  • clear():清空列表中的所有值。

QList的迭代器

QList的迭代器类型有iterator,const_iterator,reverse_iterator,const_reverse_iterator

QList的容量和性能

QList的容量相关的函数有size,capacity,reserve,squeeze,shrink_to_fit

QList的算法和工具

QList的一些常用的算法和工具函数有sort,qSort,qStableSort,qLowerBound,qUpperBound,qBinaryFind,qCount,qDeleteAll,qEqual,qFill,qFind,qFindEnd,qFindFirst,qFindLast,qGreater,qLess,qMax,qMin,qCopy,qCopyBackward,qMove,qMoveBackward,qSwap,qSwapRanges

相关推荐
Dovis(誓平步青云)26 分钟前
《QT学习第四篇:常见事件与UDP、TCP、文件系统、(锁、信号量、条件变量》
c语言·开发语言·汇编·qt
isyangli_blog9 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008119 小时前
FastAPI APIRouter
开发语言·python
Benszen9 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆9 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木9 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充10 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~10 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
basketball61610 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
春生野草10 小时前
反射、Tomcat执行
java·开发语言