以下是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();
}