最近使用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。

posted on 2024-12-17 09:28  Recreate  阅读(69)  评论(0)    收藏  举报