关于QMap的几点总结思考

关于QMap的几点总结思考关于QMap的几点总结思考题记:前段时间集中精力写了数据的分拣算法,用到了容器QMap和QMultiMap。回头再来回去该算法的时候,又觉得当时好像不是自己写的一样,于是有必要将QMap类来总结一下。首先来了解下C++中STL中的map:map是STL的一个关联容器,它提供一对一的hash。特点:第一个可以称为关键字(key),每个关键字只能在map中出现一次;第二个可能称为该关键字的值(value);map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。M

大家好,又见面了,我是你们的朋友全栈君。

关于QMap的几点总结思考

题记:
前段时间集中精力写了数据的分拣算法,用到了容器QMapQMultiMap。回头再来回去该算法的时候,又觉得当时好像不是自己写的一样,于是有必要将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() 返回键值>给定元素的第一个位置

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139251.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • gitHub新手教程

    gitHub新手教程gitHub新手教程

    2022年4月24日
    41
  • qt中readyread信号的使用_心动的信号cp组合有哪些

    qt中readyread信号的使用_心动的信号cp组合有哪些本文主要介绍readyread函数的触发机制,会涉及到一点tcp/ip和流的知识。tcp/ip和流这方面其他朋友介绍很多了,这里我就不再赘述。本文不打算使用太过专业的词汇,一方面主要目的是让大家明白,另一方面是我也不太专业。一、问题描述:你之所以会来看我这篇文章,大概是遇到了一下几个问题:1、使用QTcpSocket时,readyread函数没有触发,或者触发了,但是触发次数不是自己想…

    2025年10月14日
    2
  • C语言 图书销售管理系统[通俗易懂]

    C语言 图书销售管理系统[通俗易懂]C语言图书销售管理系统

    2022年5月2日
    72
  • 教育邮箱申请pycharm_python注册用户名和密码登录

    教育邮箱申请pycharm_python注册用户名和密码登录学生注册教育邮箱的方法不知道如何注册教育邮箱的看我上篇文。注册之后都会给登录的网址和初始密码。接下来进入这个网址JetBrains学生注册点击learnmore后,一直下拉点击applynow他会有一个信息表的填写进行申请后会发两个邮件,如下图,点击联接进行操作即可,网上说这个申请比较慢,我觉得还可以,可能是因为早上的关系,出现这个界面就说明注册成功了直接安装好pycharm的专业版在登录的时候直接填写我们的账号和密码就成功了,会显示使用终止…

    2022年8月28日
    2
  • idea激活码在哪里看 Mac【2021.10最新】

    (idea激活码在哪里看 Mac)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsa…

    2022年3月27日
    62
  • Java中的cas(this关键字java)

    在JDK5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制

    2022年4月14日
    102

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号