最近使用QMap存储数据,初始代码如下:
QMap<QString, QString> map;
map["one"] = "1";
map["two"] = "2";
map["three"] = "3";
之后,需要根据key查找某个map的值,并删除。此时一般会采用遍历QMap,然后比对key是否相同。但当时忽想到直接用下标的方法去QMap中查找,代码如下:
key = "one";
QString value = map[key]; // 注意这行代码
if(value.isEmpty() == false)
map.remove(key);
当时的想法是,如果存在这个key,那么value是有值的,如果不存在这个key,那么value是没有值的。跟踪代码也确实如此。但随后发现一个问题:
1. 如果存在key,那么就从QMap中删掉这个键值对。
2. 当再次查找这个key时,value为空,代码跳过remove这句代码。
3. 最后第三次再查找这个key时,问题来了,在第一次查找到key时,删掉的这个键值对竟然又出现了,只不过只有key值,value值是空的。
排查的过程不多说了,直接说结果:直接返回map[key],可能会有意想不到的行为。如果map包含key是没有异常问题,但map不包含key,此时又
使用map[key]方法返回值,那么会在map中插入一个key的元素,value取默认值。
正确的做法是,先检查是否包含key,然后再用下标法获取值。
附:查看是否包含key的方法有两种,如下:
方法一:map.count(key),如果含这个key,返回1,不含key的话,返回0
方法二:QMap<QString, QString>::iterator iter = map.find(key): 返回迭代器,如果 iter != map.end() 说明含这个key,否则就不含这个key。
标签:map,下标,QMap,代码,value,用法,查找,key From: https://www.cnblogs.com/RecreateBySelf/p/18610567