拓冰建站拓冰建站
首页 / 资讯中心 / 正文

QT_QMap\QHash\QVector

文章目录QT_QMap\QHash\QVectorQMap有序键值对容器基本操作遍历方式范围查询QMap 独有优势QMultiMap一键多值应用场景QHash基本操作遍历方式应用场景QVector动态数组容器基本操作常用查询操作遍历方式排序配合 STL 算法三者选型速查QMap vs QHash vs QVector 对比QT_QMap\QHash\QVectorQt框架提供的容器类也叫集合类用来批量存储和管理数据。你可以把它们理解为Qt版的高级数组/字典比C原生数组更强大、更安全、更好用。容器一句话概括生活中的类比QVector一组有序的数据列表一排储物柜每个格子有编号QMap键值对按键排序电话簿按姓名排序QHash键值对按速度优先身份证查人瞬间定位QMap有序键值对容器QMap基于红黑树平衡二叉搜索树实现所有键值对按key自动升序排列存储。插入、删除、查找的时间复杂度均为O(log n)性能稳定可预测。基本操作#includeQMapQMapQString,intmap;// 插入两种方式map[Chinese]115;// 下标操作符map.insert(Math,120);// insert 方法// 查找intvalmap.value(Math);// 120intval2map.value(Physics,0);// 键不存在返回默认值 0boolhasmap.contains(Math);// true// 修改覆盖map[Math]125;map.insert(Math,130);// 删除map.remove(Chinese);// 获取所有键/值有序QListQStringkeysmap.keys();QListintvaluesmap.values();// 大小与判空map.size();// 元素个数map.isEmpty();// 是否为空map.clear();// 清空遍历方式// 方式一Java 风格迭代器QMapIteratorQString,intit(map);while(it.hasNext()){it.next();qDebug()it.key():it.value();}// 方式二STL 风格迭代器推荐QMapQString,int::const_iterator citmap.constBegin();while(cit!map.constEnd()){qDebug()cit.key():cit.value();cit;}// 方式三C11 范围 for最简洁for(autoit:map){qDebug()it;// 只遍历 value}范围查询QMap 独有优势QMapint,QStringscoreMap;scoreMap.insert(85,Bob);scoreMap.insert(90,Alice);scoreMap.insert(95,Charlie);scoreMap.insert(70,Dave);// lowerBound返回第一个 key 的迭代器autoitscoreMap.lowerBound(85);// 指向 (85, Bob)// upperBound返回第一个 key 的迭代器autoit2scoreMap.upperBound(85);// 指向 (90, Alice)QMultiMap一键多值QMultiMapQString,QStringmmap;mmap.insert(student,name);mmap.insert(student,age);mmap.insert(student,sex);// 同一个键 student 对应多个值应用场景配置管理键为配置项名称值为配置项值数据存储和排序按 key 有序展示国际化翻译映射键为原文值为译文QHashQHash 基于哈希表实现通过 qHash() 函数计算键的哈希值来定位存储位置。平均查找/插入/删除时间复杂度为 O(1)但最坏情况哈希冲突严重会退化为 O(n)。键值对无序存储遍历顺序不可预测。基本操作#includeQHashQHashQString,inthash;// 插入hash[key1]3;hash[key2]8;hash.insert(key3,4);// 查找推荐用 value contains避免 operator[] 的副作用intvalhash.value(key1);// 3intval2hash.value(key4,0);// 键不存在返回默认值 0boolhashash.contains(key2);// true// 修改hash[key1]99;// 删除hash.remove(key3);// 获取所有键/值无序QListQStringkeyshash.keys();QListintvalueshash.values();查找时推荐使用value()和contains()而不是operator[]。因为operator[]在键不存在时会自动插入一个默认值导致意外的内存增长。遍历方式// STL 风格迭代器QHashQString,int::const_iterator it;for(ithash.constBegin();it!hash.constEnd();it){qDebug()it.key():it.value();}// C11 范围 forfor(autoit:hash){qDebug()it;}应用场景高速查找和缓存管理数据去重资源 ID 映射表信号槽连接索引QVector动态数组容器QVector 封装了连续内存块的动态数组所有元素物理相邻存储。支持 O(1) 随机访问CPU 缓存预取友好可与 C 风格 API 无缝对接。但插入/删除中间元素需移动后续数据时间复杂度为 O(n)。基本操作#includeQVectorQVectorintvec;// 插入vec.append(10);vec.append(20);vec.append(30);vec4050;// 流式插入// 指定位置插入vec.insert(2,25);// 在索引2处插入25// 访问intval1vec[0];// 10可读可写intval2vec.at(1);// 20只读更安全有越界检查// 修改vec[0]99;// 删除vec.removeAt(2);// 删除索引2的元素vec.removeFirst();// 删除第一个vec.removeLast();// 删除最后一个vec.clear();// 清空// 大小与容量vec.size();// 元素个数vec.isEmpty();// 是否为空vec.reserve(100);// 预分配100个元素的空间性能优化vec.squeeze();// 释放多余容量常用查询操作QVectorintvec{1,2,3,4,5};vec.contains(3);// truevec.indexOf(3);// 2首次出现的索引vec.lastIndexOf(3);// 2最后出现的索引vec.count(3);// 1出现次数vec.fill(0,5);// 填充为 [0, 0, 0, 0, 0]vec.mid(1,3);// 截取子数组 [2, 3, 4]遍历方式QVectorintvec{10,20,30,40,50};// 方式一索引遍历for(inti0;ivec.size();i){qDebug()vec[i];}// 方式二迭代器for(autoitvec.constBegin();it!vec.constEnd();it){qDebug()*it;}// 方式三C11 范围 for最简洁for(intval:vec){qDebug()val;}排序配合 STL 算法QVectorintvec{5,2,8,1,9};std::sort(vec.begin(),vec.end());// 升序std::sort(vec.begin(),vec.end(),std::greaterint());// 降序std::reverse(vec.begin(),vec.end());// 反转三者选型速查需求场景推荐容器键值对 需要有序遍历QMap键值对 追求极致查找速度QHash键值对 数据量很小 20QMap一键对应多值QMultiMap/QMultiHash同类型数据集合 随机访问QVector/QList频繁头部/尾部增删QListQt6 已等同 QVector去重集合QSet底层基于 QHash范围查询如 ≥85 分的学生QMap支持lowerBoundQMap vs QHash vs QVector 对比对比项QMapQHashQVector本质键值对字典键值对字典动态数组底层结构红黑树哈希表连续内存数组存储方式key → valuekey → value单个 value是否有序按 key 自动升序无序按插入顺序查找速度O(log n)O(1)最快O(n)需遍历插入速度O(log n)O(1)O(1)尾部追加随机访问不支持不支持通过索引 O(1)键的要求operatoroperatorqHash()无需键内存占用中等节点指针开销较大桶预分配最小连续内存数据量小时更快 20 个元素哈希计算开销相对大最快数据量大时较慢最快快 3-5 倍查找慢但遍历快
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门