核心内容摘要
动态阈值设计揭秘:让MGeo更聪明地判断地址
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); //
初始化 QVector多种方式 // 方式1空容器后续添加元素 QVectorint vec1; // 方式2初始化时指定大小和默认值创建5个元素每个元素值为0 QVectorint vec2(
; // 方式3初始化时指定大小和自定义默认值创建5个元素每个元素值为10 QVectorint vec3(5,
; // 方式4C11 初始化列表推荐简洁直观 QVectorQString vec4 {Apple, Banana, Orange}; //
添加元素常用 // 尾部添加高效时间复杂度 O(
扩容时除外 vec
append(
; vec
append(
; vec
append(
; // 尾部添加的简写等价于 append vec1 4 5; // 头部添加低效时间复杂度 O(n)需要移动所有元素 vec
prepend(
; // 指定索引位置插入元素索引从0开始同样需要移动后续元素 vec
insert(3,
; // 在索引3的位置插入99原元素后移 //
访问元素两种方式 qDebug() 访问元素 ; // 方式1[] 运算符快速访问无越界检查越界会导致未定义行为 qDebug() 索引0的元素 vec1[0]; // 方式2at() 方法推荐有越界检查越界会抛出警告并返回默认值更安全 qDebug() 索引3的元素 vec
at(
; // 访问首尾元素便捷接口 qDebug() 第一个元素 vec
first(); qDebug() 最后一个元素 vec
last(); //
修改元素 qDebug() 修改元素 ; vec1[3] 88; // 用[] 修改 vec
replace(4,
; // 用replace() 方法修改等价于[]有越界检查 qDebug() 修改后索引3 vec
at(
索引4 vec
at(
; //
删除元素 qDebug() 删除元素 ; // 删除指定索引的元素 vec
removeAt(
; // 删除首尾元素 vec
removeFirst(); vec
removeLast(); // 删除所有值为某个特定值的元素 vec
removeAll(
; // 清空所有元素容器大小变为0内存可选择保留或释放 // vec
clear(); // 清空元素保留内存空间便于后续快速添加 // vec
squeeze(); // 释放多余的内存空间仅保留当前元素所需内存 //
常用查询操作 qDebug() 查询信息 ; qDebug() 容器大小元素个数 vec
size(); qDebug() 是否为空 vec
isEmpty(); qDebug() 是否包含元素2 vec
contains(
; qDebug() 元素2第一次出现的索引 vec
indexOf(
; qDebug() 元素2最后一次出现的索引 vec
lastIndexOf(
; qDebug() 元素2的出现次数 vec
count(
; //
遍历 QVector三种常用方式 qDebug() 遍历容器 ; // 方式1普通for循环通过索引 qDebug() 普通for循环; for (int i 0; i vec
size(); i) { qDebug() vec
at(i); } // 方式2foreach 循环Qt 专属简洁直观只读遍历推荐 qDebug() foreach 循环; foreach (int val, vec
{ qDebug() val; } // 方式3C11 范围for循环推荐现代C 风格简洁高效 qDebug() 范围for循环; for (int val : vec
{ qDebug() val; } return a.exec(); }QList的原理QList 是 Qt 框架中最常用、最便捷的通用动态容器它的设计目标是兼顾多种场景的效率在 Qt 开发中出现的频率远高于 QVector尤其是界面开发、信号槽传参场景。
动态数组内存分配QLSt使用动态内存分配来存储元素。
内部使用一个指向数据的指针来管理内存QLst允许预先分配一定数量的空间当QLst需要存储更多元素时它会根据当前的分配内存大小动态增长数据存储QLst使用一个连续的内存块来存储元素。
每个元素在内存中是连续排列的这使得随机访问操作非常高效时间复杂度为0(
引用计数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); //