关于QMap的几点总结思考

题记:
前段时间集中精力写了数据的分拣算法,用到了容器QMap和QMultiMap。回头再来回去该算法的时候,又觉得当时好像不是自己写的一样,于是有必要将QMap类来总结一下。

首先来了解下C++中STL中的map:

map是STL的一个关联容器,它提供一对一的hash。
特点:

  • 第一个可以称为关键字(key),每个关键字只能在map中出现一次;
  • 第二个可能称为该关键字的值(value);

map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。

Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。

在map内部所有的数据都是有序的,后边我们会见识到有序的好处。比如一个班级中,每个学生的学号跟他的姓名就存在著一对一映射的关系。


Qt 中的QMap 和c++中的map 功能等同,但用法稍有不同罢了。

QMap 的功能:
自动建立key - value的对应。key 和 value可以是任意你需要的类型,包括自定义类型。

在QMap中的自定义数据类型需要重载运算符 <

QMap 的使用:
QMap对象是模板类,需要关键字和存储对象两个模板参数:
QMap<int, string> personnel;
这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.

既然QMap是一个有序的容器。对此容器的操作无非就是增删改查

1、插入:

//定义一个mapStudent的map数据对象
QMap<int, string> mapStudent;
//insert 方式插入
mapStudent.insert(000,"student_one");
//数组“array”方式输入
mapStudent[001] = "student_two";

这里有两种方式来插入:1、操作符 [] 2、insert 方式

注意:不管那种方式,如果前后插入的键值相同,那么后一个插入的数据会覆盖前一个数据。

2、查找:

查找的方式有三总:1、操作符[] 2、contains() 3、value()
但是,我们推荐使用后两种,因为"操作符[]" 会在找不到键的情况下 ,默认会插入数据。例如下面的代码中,会创建1000 项目。

// WRONG
QMap<int, QWidget *> map;

for (int i = 0; i < 1000; ++i) {
if (map[i] == okButton)
cout << "Found button at index " << i << endl;
}

运用 contains():

int timeout = 30;
if (map.contains(“TIMEOUT”))
timeout = map.value(“TIMEOUT”);

使用value()

int timeout = map.value(“TIMEOUT”, 30);

上面两端代码是等价的。当找不到键“TIMEOUT”,将timeout变量的值赋值为30,如果找到,那就将找到的值赋值给变量timeout。

3、遍历

Java 风格:使用QMapIterator

QMapIterator<QString, int> i(map);
while (i.hasNext()) {
i.next();
cout << i.key() << ": " << i.value() << endl;
}

STL 风格:使用 iterator

QMap<QString, int>::const_iterator i = map.constBegin();
while (i != map.constEnd()) {
cout << i.key() << ": " << i.value() << endl;
++i;
}

如果你需要将QMap中的所有的值遍历出来,而不需要键也遍历出来,可以这样写:

QMap<QString, int> map;

foreach (int value, map)
cout << value << endl;

4、删除

1、remove(): 移除你想要给定的键的任何一项
2、clear() 清空对象
3、take(),移除你想要给定的键的任何一项,,并返回该键下对应的值。

5、其他操作:

1、count(const Key &key) 返回该键下的数据项有几项。

2、empty() 等同于 isempty() 容器是否为空

3、keys() 返回所有键的列表

4、size() 返回键值对的数量

5、 swap(QMap<Key, T> &other) 与另一个容器map 交换

6、 take(const Key &key) 删除该键下的键值对,并返回改建所对应的值

6、unite(const QMap<Key, T> &other) 将另一个map中的键值对插入到本map中。

7、QList QMap::values() const 返回值列表

8、lower_bound() 返回键值>=给定元素的第一个位置

9、 upper_bound() 返回键值>给定元素的第一个位置

关于QMap的几点总结思考相关推荐

  1. 关于python导入模块和package的一些深度思考

    背景 在python中有导入模块和导入package一说,这篇文章主要介绍导入模块和package的一些思考. 首先什么是模块?什么是package? 模块:用来从逻辑上组织python代码(变量,函 ...

  2. 站在巨人的肩膀上“思考”问题,重在思考而不是拿来主义

    米老师按:觉得值得讨论的小文!我还要认真地想一想 主题:围绕职责链设计模式-计算收费有效时间博客展开讨论 参与人: 讨论时间: 讨论内容 这次讨论主要分为以下几点: 一.职责链模式应用于机房收费系统计 ...

  3. 由Node.js事件驱动模型引发的思考

    引言 近段时间听说了Node.js,很多文章表述这个事件驱动模型多么多么优秀,应用在服务器开发中有很大的优势,本身对此十分感性去,决定深入了解一下,由此也引发了一些对程序设计的思考,记录下来. 什么是 ...

  4. 看了极光推送技术原理的几点思考

    看了极光推送技术原理的几点思考 分类: android2012-11-26 20:50 16586人阅读 评论(18) 收藏 举报 目录(?)[+] 移动互联网应用现状 因为手机平台本身.电量.网络流 ...

  5. C++ 从双重检查锁定问题 到 内存屏障的一些思考

    文章目录 1. 问题描述 2. DCLP 的问题 和 指令执行顺序 2.1 Volatile 关键字 2.2 C++11 的内存模型 3. C++11内存模型 解决DCLP问题 3.1 内存屏障和获得 ...

  6. 关于大型网站技术演进的思考(五)--存储的瓶颈(5)

    上文里我遗留了两个问题,一个问题是数据库做了水平拆分以后,如果我们对主键的设计采取一种均匀分布的策略,那么它对于被水平拆分出的表后续的查询操作将有何种影响,第二个问题就是水平拆分的扩容问题.这两个问题 ...

  7. 对WEB前端的几段思考(一)——界面设计和性能优化(整理中)

    尽管我并非艺术出生,既没有任何设计基础,又没有较高艺术涵养,也深谙在短时间内创造一定艺术造诣并非易事,但是既然当初选择从事网站前端开发,我的目光不能仅停留在前端代码上.作为一名志向在前端领域发展的人员 ...

  8. 从0开始搭建编程框架——思考

    需求来源于问题.(转载请指明出于breaksoftware的csdn博客) 之前有个人做前端开发的同学在群里问"C语言能做什么?能写网页么?",然后大家就开始基于这个问题展开争辩. ...

  9. 以金山界面库(openkui)为例思考和分析界面库的设计和实现——代码结构(完)

    三年前,准备将金山界面库做一个全面的剖析.后来由于种种原因,这个系列被中断而一直没有更新.时过境迁,现在在windows上从事开发的人员越来越少,关注这块的技术的朋友也很少了.本以为这系列也随着技术的 ...

最新文章

  1. JavaScript脚本放在哪里
  2. DB2数据库性能调整和优化(第2版)
  3. 【转】VS技巧—任务列表Task List(ToDoList)
  4. 智慧水务建设纪实:数字可视化大屏+智能AI,凭啥这么强?
  5. 顺序存取和随机存取的区别_内存和硬盘的区别
  6. 云服务器磁盘挂载_实战记录阿里云服务器不关机扩展系统盘容量/磁盘扩容
  7. java多线程nullpointerexception_温故而知新!越是基础越容易被忽略,java最全基础知识,附赠资料...
  8. 春招妥了!资深技术面试官教你这样准备 Java 面试! | CSDN 博文精选
  9. vb.net 同时给多个属性赋值_一个float值赋值给double,结果是什么?进来重温一下类型提升吧...
  10. win10设置Python程序定时运行(设置计划任务)
  11. zynq processing system 参数设置_【正点原子FPGA连载】第六章自定义IP核-呼吸灯实验-领航者 ZYNQ 之嵌入式开发指南...
  12. java 合并pdf_用iText分割和合并pdf文件
  13. html字体如何运用在ps上,PS文字排版工具的使用技巧
  14. pyecharts学习笔记
  15. c语言编写生日祝福语大全,过生日的祝福语
  16. 【第一周:数据分析思维】7周成为数据分析师
  17. vb UBound 数据上界
  18. linux防文件误删
  19. mac 修改文件权限为777可读可写可执行
  20. SQL(16)--获取员工当前薪水比其manager薪水还高的相关信息

热门文章

  1. Linux下的图形界面编程
  2. LIBSVM的使用方法以及参数注释总结
  3. [我的1024开源程序]30元写的广义误差分布函数
  4. python做项目看板_三、使用python数据仓库实现可视化看板
  5. OpenGL编程指南14:混合半透明Blend
  6. win7下不能替换系统文件的解决办法
  7. go get 命令提示没有权限问题解决
  8. 23种设计模式C++源码与UML实现--享元模式
  9. 【CyberSecurityLearning 21】防火墙
  10. Tomcat设置虚拟目录的方法, 不修改server.xm