unordered_map什么时候返回 -1?

When does unordered_map return -1?

本文关键字:返回 什么时候 map unordered      更新时间:2023-10-16

我正在使用无序映射来检查向量中的重复项,然后将其擦除。有时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]] <<"nn";
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

编辑:我最初输入错误。它已被编辑!(第一篇文章在堆栈溢出!! 我在学习!

这部分是问题所在:

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

我在你的代码中看到几个问题。

问题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
}
}

除了其他答案之外,我建议使用集合而不是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();
}