QVector的原理QVector是 Qt 框架提供的动态数组容器功能类似于 C 标准库的std::vector但和 Qt 生态的其他类如QString、QVariant兼容性更好还提供了一些 Qt 专属的便捷接口。底层存储结构QVector使用动态数组来存储数据。动态数组的一个特点是元素存储在连续的内存位置上可以通过索引高效访问数据内存管理QVector会根据需要动态调整其容量。当容器需要扩展时会分配一个新的内存块将旧数据复制到新的位置然后释放旧内存。这种扩展通常是按倍数增长的以减少多次扩展的开销拷贝与移动在C11之后QVector支持移动语义和拷贝构造允许对象在容器间传递时减少不必要的内存拷贝元素类型存储QVector中的元素类型通常是指针类型或在栈上分配的类型如int,doubles等。对于复杂类型QVector会使用构造函数和析构函数来管理元素的创建和销毁#include QCoreApplication #include QVector #include QDebug int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 1. 初始化 QVector多种方式 // 方式1空容器后续添加元素 QVectorint vec1; // 方式2初始化时指定大小和默认值创建5个元素每个元素值为0 QVectorint vec2(5); // 方式3初始化时指定大小和自定义默认值创建5个元素每个元素值为10 QVectorint vec3(5, 10); // 方式4C11 初始化列表推荐简洁直观 QVectorQString vec4 {Apple, Banana, Orange}; // 2. 添加元素常用 // 尾部添加高效时间复杂度 O(1)扩容时除外 vec1.append(1); vec1.append(2); vec1.append(3); // 尾部添加的简写等价于 append vec1 4 5; // 头部添加低效时间复杂度 O(n)需要移动所有元素 vec1.prepend(0); // 指定索引位置插入元素索引从0开始同样需要移动后续元素 vec1.insert(3, 99); // 在索引3的位置插入99原元素后移 // 3. 访问元素两种方式 qDebug() 访问元素 ; // 方式1[] 运算符快速访问无越界检查越界会导致未定义行为 qDebug() 索引0的元素 vec1[0]; // 方式2at() 方法推荐有越界检查越界会抛出警告并返回默认值更安全 qDebug() 索引3的元素 vec1.at(3); // 访问首尾元素便捷接口 qDebug() 第一个元素 vec1.first(); qDebug() 最后一个元素 vec1.last(); // 4. 修改元素 qDebug() 修改元素 ; vec1[3] 88; // 用[] 修改 vec1.replace(4, 77); // 用replace() 方法修改等价于[]有越界检查 qDebug() 修改后索引3 vec1.at(3) 索引4 vec1.at(4); // 5. 删除元素 qDebug() 删除元素 ; // 删除指定索引的元素 vec1.removeAt(3); // 删除首尾元素 vec1.removeFirst(); vec1.removeLast(); // 删除所有值为某个特定值的元素 vec1.removeAll(77); // 清空所有元素容器大小变为0内存可选择保留或释放 // vec1.clear(); // 清空元素保留内存空间便于后续快速添加 // vec1.squeeze(); // 释放多余的内存空间仅保留当前元素所需内存 // 6. 常用查询操作 qDebug() 查询信息 ; qDebug() 容器大小元素个数 vec1.size(); qDebug() 是否为空 vec1.isEmpty(); qDebug() 是否包含元素2 vec1.contains(2); qDebug() 元素2第一次出现的索引 vec1.indexOf(2); qDebug() 元素2最后一次出现的索引 vec1.lastIndexOf(2); qDebug() 元素2的出现次数 vec1.count(2); // 7. 遍历 QVector三种常用方式 qDebug() 遍历容器 ; // 方式1普通for循环通过索引 qDebug() 普通for循环; for (int i 0; i vec1.size(); i) { qDebug() vec1.at(i); } // 方式2foreach 循环Qt 专属简洁直观只读遍历推荐 qDebug() foreach 循环; foreach (int val, vec1) { qDebug() val; } // 方式3C11 范围for循环推荐现代C 风格简洁高效 qDebug() 范围for循环; for (int val : vec1) { qDebug() val; } return a.exec(); }QList的原理QList 是 Qt 框架中最常用、最便捷的通用动态容器它的设计目标是兼顾多种场景的效率在 Qt 开发中出现的频率远高于 QVector尤其是界面开发、信号槽传参场景。动态数组内存分配QLSt使用动态内存分配来存储元素。内部使用一个指向数据的指针来管理内存QLst允许预先分配一定数量的空间当QLst需要存储更多元素时它会根据当前的分配内存大小动态增长数据存储QLst使用一个连续的内存块来存储元素。每个元素在内存中是连续排列的这使得随机访问操作非常高效时间复杂度为0(1)引用计数QList使用引用计数来管理内存。每个QList对象内部都、有一个引用计数器用于跟踪有多少个QLst对象共享同一块内存。当引用计数为零时内存会被自动释放。这种机制减少了内存泄漏的风险并提高了内存使用效率QStackQStack是 Qt 对栈数据结构的封装核心特性先进后出LIFO, Last In First Out就像你往一个空盒子里放书本最后放进去的书本最先被拿出来最开始放进去的书本只能最后被关键操作只有两个核心操作是高效的其他操作如访问中间元素不被推荐效率低入栈Push往栈的 ** 顶部栈顶** 添加元素相当于往盒子里放新书。】出栈Pop从栈的 ** 顶部栈顶** 移除并返回元素相当于从盒子里拿最上面的书。查看栈顶Top仅获取栈顶元素不移除它。#include QCoreApplication #include QStack #include QDebug int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 1. 初始化 QStack模板类指定存储元素类型 QStackint stack; // 2. 核心操作入栈push() qDebug() 入栈操作 ; stack.push(10); // 栈底10 stack.push(20); // 栈中10 - 20 stack.push(30); // 栈顶30当前栈10, 20, 30 stack.push(40); // 栈顶更新40当前栈10, 20, 30, 40 qDebug() 入栈后栈的大小 stack.size(); qDebug() 当前栈顶元素 stack.top(); // 查看栈顶输出 40 // 3. 核心操作出栈pop() qDebug() 出栈操作 ; stack.pop(); // 移除栈顶 40当前栈10, 20, 30 qDebug() 第一次出栈后栈顶 stack.top(); // 输出 30 stack.pop(); // 移除栈顶 30当前栈10, 20 qDebug() 第二次出栈后栈顶 stack.top(); // 输出 20 qDebug() 出栈后栈的大小 stack.size(); // 4. 辅助操作判断栈空、清空栈 qDebug() 辅助操作 ; qDebug() 当前栈是否为空 stack.isEmpty(); // 输出 false // 清空栈底层调用 QVector::clear() stack.clear(); qDebug() 清空后栈是否为空 stack.isEmpty(); // 输出 true // 注意栈为空时调用 top() 会返回元素类型的默认值int 为 0并抛出警告 // qDebug() stack.top(); // 不推荐空栈访问栈顶无意义 return a.exec(); }QQueue的原理QQueue是 Qt 对队列这种数据结构的封装#include QCoreApplication #include QQueue #include QDebug int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 1. 初始化 QQueue模板类指定存储元素类型 QQueueQString queue; // 2. 核心操作入队enqueue() qDebug() 入队操作 ; queue.enqueue(任务1打印文档); // 队首任务1 queue.enqueue(任务2下载文件); // 队列中间任务1 - 任务2 queue.enqueue(任务3发送邮件); // 队尾任务3当前队列任务1 → 任务2 → 任务3 queue.enqueue(任务4清理缓存); // 队尾更新任务4当前队列任务1 → 任务2 → 任务3 → 任务4 qDebug() 入队后队列大小 queue.size(); qDebug() 当前队首元素 queue.head(); // 查看队首输出 任务1打印文档 // 3. 核心操作出队dequeue() qDebug() 出队操作 ; // 出队移除并返回队首元素 QString task1 queue.dequeue(); qDebug() 完成的任务 task1; // 输出 任务1打印文档 qDebug() 第一次出队后队首 queue.head(); // 输出 任务2下载文件 QString task2 queue.dequeue(); qDebug() 完成的任务 task2; // 输出 任务2下载文件 qDebug() 第二次出队后队首 queue.head(); // 输出 任务3发送邮件 qDebug() 出队后队列大小 queue.size(); // 4. 辅助操作判断队列空、清空队列 qDebug() 辅助操作 ; qDebug() 当前队列是否为空 queue.isEmpty(); // 输出 false // 清空队列底层调用 QList::clear() queue.clear(); qDebug() 清空后队列是否为空 queue.isEmpty(); // 输出 true // 注意队列为空时调用 head() 会返回元素类型的默认值QString 为空字符串并抛出警告 // 调用 dequeue() 会返回默认值无其他操作均不推荐 // qDebug() queue.head(); // qDebug() queue.dequeue(); return a.exec(); }