map<int,int> counter; counter[nums[i]]++;

3

我在LeetCode上看到了这段代码,它是一个寻找主要元素的问题。以下是问题描述:

给定一个大小为n的数组,找出其中的主要元素。主要元素是指出现次数超过⌊ n/2 ⌋的元素。

您可以假设该数组非空且主要元素始终存在于数组中。

讨论区中有一份答案,代码如下:

class Solution
{
public:
    int majorityElement(vector<int>& nums) 
    {
        map<int, int> cnt;
        for(int i=0; i < nums.size(); i++)
            cnt[ nums[i] ]++;

        int n = nums.size();
        for(map<int, int>::iterator iter=cnt.begin(); iter!=cnt.end();iter++)
            if( iter->second > n/2 )
                return iter->first;
    }
};

我对这行代码很好奇:cnt[ nums[i] ]++;

难道不需要先初始化 cnt[nums[i]]=0 吗? 我认为需要先初始化,否则由于没有现有的键值 nums[i] 来执行 ++,就会导致内存泄漏。 我错了吗?


std::map<int,int> m; std::cout << m[5] << std::endl; 输出0,此时map已有1个条目。 - BitTickler
1个回答

4
std::map::operator[]被定义为在给定键值不存在时默认初始化该键的值。根据标准,[map.access]

T& operator[](const key_type& x);

1 Effects: 如果在映射中没有与x等价的键,则将value_type(x, T())插入到映射中。

对于整数类型int,默认值为0,因此不需要进一步操作。

谢谢你,Mankarse! - leo lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接