unordered_map什么时候返回 -1?
When does unordered_map return -1?
我正在使用无序映射来检查向量中的重复项,然后将其擦除。有时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();
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 什么时候在C++中返回常量引用是个好主意
- 什么时候调用析构函数
- boost odeint什么时候真正调用观测者
- 编译器对数组声明大小的计算。什么时候发生?
- 查找不存在的键时,unordered_map返回什么
- unordered_map什么时候返回 -1?
- vsnprintf 什么时候可以返回 0?
- Dynamic_cast何时返回0,什么时候引发异常?CPP
- C++什么时候可以返回类实例?
- 我什么时候应该返回 std::ostream
- GCC:我什么时候可以期望返回大型C++对象是有效的
- 我们什么时候可以省略 C++11 lambda 中的返回类型
- 当你通过引用返回对象时,你什么时候需要担心对象会被破坏
- 函数什么时候必须在c++中返回引用
- C++,什么时候应该返回引用
- 我应该什么时候通过 T const& 返回?
- 什么时候对话框返回QDialog::Rejected ?
- 什么时候应该使用c++ 14自动返回类型扣除
- 什么时候应该对函数返回值使用std::move