c++ 使用map导致死循环的坑

(1)leetcode里1346题

给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。

更正式地,检查是否存在两个下标 i 和 j 满足:

  • i != j
  • 0 <= i, j < arr.length
  • arr[i] == 2 * arr[j]
class Solution {
public:
    bool checkIfExist(vector<int>& arr) {
        map<int,int>mymap;
        int count0=0;
        for(int i=0;i<arr.size();++i)
        {
            if(arr[i]==0)
            {
                count0++;
                if(count0==2)return 1;
            }
            mymap[arr[i]]=arr[i]*2;
        }

        for(int i=0;i<mymap.size();++i)
        {
            if(mymap[mymap[arr[i]]]!=0)return 1;
        }
        return 0;
        
    }
};

原因:使用map[]访问不存在的关键字后会自动将这个关键字加入map,对应值为默认值。因此最后for循环中mymap.size()随着访问不存在的关键字会不断增大,而mymap.size()增大又会继续循环,导致死循环。(实际上这里没有死循环,关键字过大之后直接报错了)

解决方法:可以先记录mymap.size(),然后使用这个做记录的数作为循环的判断条件


(2)此外,map中还有一个容易导致死循环的地方,就是关于map.size()的使用,它的返回值为一个无符号整型,比如运行如下代码:

map<int, int>my;
cout << my.size()-1;

输出并不会为-1,而是会变成一个很大的值,比如x64:

解决方法:将其转换为int类型即可:

int(my.size()-1)
发布了57 篇原创文章 · 获赞 260 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_40692109/article/details/104435673