QMap和std::map加强型for循环遍历时用法的区别

以下是QMap和std::map可行的遍历方式:

//分别利用QMap和std::map定义两个map(模板中的类型是随意写的)
QMap<unsigned char, int> qMap;
std::map<unsigned char, int> map;
//用于获取两种map的键和值
unsigned char ch;
int value;

//QMap直接遍历key
for (auto& key : qMap.keys()) {
    //其中key是qMap的键
    ch = key;
    value = qMap.value(key);
}
//std::map获取到的是键值对
for (auto& pair : map) {
    ch = pair.first;
    value = pair.second;
}

问题来了,如果我们对QMap进行如下遍历可以吗?

for (auto& pair : qMap) {
    ch = pair.first;
    value = pair.second;
}

首先,pair在这里不是一个键值对!通过实践可以发现根本不存在pair.first和pair.second,也就是说pair不是一个键值对。这里要小心踩坑!
其次,pair也不是键!不要把pair当键使用!这里有一个很大的陷阱:我写了如下代码,把pair当做键使用

for (auto& pair : qMap) {
	//将pair当做键使用
    ch = pair;
    value = qMap.value(pair);
}

我们会发现这段代码不警告不报错,风平浪静。。。。。。但是得出来的结果和正确的遍历方法完全不同,大家记得避一下坑。

这里的pair具体有什么意义我目前也不清楚,但是确实不能这样用。


还遇到一个奇怪的现象:最开始给出的QMap可行的遍历方式其实是会警告的,也就是下面这一段代码

//QMap直接遍历key
for (auto& key : qMap.keys()) {
    //其中key是qMap的键
    ch = key;
    value = qMap.value(key);
}

下面是我实际过程中遇到的警告:在这里插入图片描述

警告的具体内容:D:\ProjectCPP\CompressionTool\compressiontool.cpp:68:5: allocating an unneeded temporary container [clazy-container-anti-pattern](着重看加粗的这一句)

警告的意思大致是为一个不必要的临时容器分配了一块内存。这里出现这个问题的原因在于:QMap::keys()是一个函数,用于返回QMap中所有键的列表。说白了就是返回一个容器,但是这个容器是一个临时的,我们跑完for循环它的生命周期就结束了。这个过程就为一个不必要的临时容器分配了内存,因此也就影响了我们运行的效率。

我查了一下官方文档,下面空框圈出来的是推荐的解决办法——使用迭代器。
在这里插入图片描述
因此我们只需要改成以下代码就没有问题了:

    for (auto iterator = weightMap.begin(); iterator != weightMap.end(); iterator++) {
        ch = iterator.key();
        value = iterator.value();
    }
  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hq Huang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值