【问题标题】:When does unordered_map return -1? [closed]unordered_map 什么时候返回 -1? [关闭]
【发布时间】:2020-05-20 19:38:49
【问题描述】:

我正在使用无序映射来检查向量中的重复项,然后将其删除。有时 unordered_map 返回 -1。我很困惑为什么会发生这种情况

int removeDuplicates(vector<int>& nums) {

        map<int, int> hash_table;

        for(int i=0; i<nums.size(); i++)
        {
            cout<<nums[i]<<" : "<<hash_table[nums[i]] <<", ";
            hash_table[nums[i]] = hash_table[nums[i]] + 1;

            cout<<nums[i]<<" : "<<hash_table[nums[i]] <<"\n\n";
            if(hash_table[nums[i]] > 1)
            {
                //cout<<"Erasing "<<nums[i]<<"\n";
                nums.erase(nums.begin() + i);
                hash_table[nums[i]] = hash_table[nums[i]] - 1;
            }
        }
        cout<<"\n";
        return nums.size();
    }

这是输入:

[0,0,1,1,1,2,2,3,3,4]

这是标准输出:

0 : 0, 
0 : 1

0 : 1, 
0 : 2

1 : -1, 
1 : 0

1 : 0, 
1 : 1

2 : 0, 
2 : 1

2 : 1, 
2 : 2

3 : -1, 
3 : 0

4 : 0, 
4 : 1

编辑:我最初输入错误。它已被编辑! (关于stackoverflow的第一篇文章!!我正在学习!)

【问题讨论】:

  • 建议,不要在这里使用地图。使用一套。 if ( !set.insert( nums[i] ).second ) { *remove from array* }

标签: c++ duplicates hashtable unordered-map


【解决方案1】:

这部分是问题:

nums.erase(nums.begin() + i);
hash_table[nums[i]] = hash_table[nums[i]] - 1;

您从nums 中删除一个项目,然后然后使用它来降低价值。这意味着当有两个零时,您从nums 中删除一个零,然后减少下一个在该位置的数字的值,即 1。

先减少,再擦除,所以把线反过来。

另外我觉得你给的数列不正确,好像是0, 0, 1, 1, 2, 2, 3, 4

【讨论】:

  • 这很有帮助!你是对的,我复制并粘贴了错误的输入。感谢您指出这一点。
【解决方案2】:

我发现您的代码中有几个问题。

问题 1

线条

nums.erase(nums.begin() + i);
hash_table[nums[i]] = hash_table[nums[i]] - 1;

需要更换。他们需要

hash_table[nums[i]] = hash_table[nums[i]] - 1;
nums.erase(nums.begin() + i);

按照您的方式,在删除nums[i] 之后,您将递减hash_table[nums[i]],并且它具有被删除项目之后的项目的值。

问题 2

当您从 nums 中删除项目时,您不得增加 i。否则,您将跳过一个元素。 for 循环需要:

for(int i=0; i<nums.size(); /* i++ */ )
{
   ...

   if(hash_table[nums[i]] > 1)
   {
       hash_table[nums[i]] = hash_table[nums[i]] - 1;
       nums.erase(nums.begin() + i);

       // Don't increment i
   }
   else
   {
       // Increment i
       ++i
   }
}

【讨论】:

    【解决方案3】:

    除了其他答案,我建议使用 set 而不是 map,这不必要地复杂:

    int removeDuplicates(std::vector<int>& nums)
    {
       std::set<int> hash_table;
    
       for(int i = 0; i < nums.size(); )
       {
          bool inserted;
          std::tie(std::ignore, bool) = hash_table.insert(nums[i]);
          if (!inserted)
             nums.erase(nums.begin() + i);
          else
             i++;
       }
    
       return nums.size();
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-08
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2014-10-25
      • 2010-10-17
      相关资源
      最近更新 更多