引用绑定到'value_type'类型的空指针

lin*_*ozf 12 c++ vector

这是leetcode 26.给定一个排序数组,就地删除重复项,使每个元素只出现一次并返回新的长度.给出一个例子nums = [1,1,2],函数应该返回[1,2].

以下是我的代码.我删除了所有其他副本,只留下其中一个.但是我总是reference binding to null pointer of type 'value_type'在提交时出错.如果有人能帮助我,我将不胜感激!

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int i = 0;
        while(i < nums.size() - 1) {
            if (nums[i] == nums[i + 1]) {
                nums.erase(nums.begin() + i);
            } 
            else i++;
        }
        return nums.size();
    }
};
Run Code Online (Sandbox Code Playgroud)

0x4*_*2D2 12

vector<T>::size()返回type的值size_t,这是一个无符号类型.假设传入的向量是空的,因此向量的长度为0. nums.size() - 1将导致整数下溢,您实际上将0与非常大的正数进行比较.这将评估为true,导致循环运行并i通过数组边界.

为了解决这个问题,你可以投nums.size()int先发制人或大小存储在一个整型变量,而与之媲美.

  • 或将其更改为`while(i + 1 &lt;nums.size())`。只要“ nums.size()”不是“ INT_MAX”,它就可以工作。 (2认同)

R S*_*ahu 8

正如发布的那样,该函数适用于元素为 的向量[1 1 2]。请参阅https://ideone.com/ppuRg5

然而,我在你的函数中看到的一个问题是,如果你向它传递一个空向量,它就会遇到问题。

while(i < nums.size() - 1)
Run Code Online (Sandbox Code Playgroud)

当为空时就会出现问题nums。如果您发现它是一个空向量,您可以通过立即从函数返回来预先避免该问题。

另外,使用无符号类型以i避免编译器关于比较有符号类型和无符号类型的警告。

int removeDuplicates(std::vector<int>& nums) {
   if ( nums.empty() )
   {
      return 0;
   }

   unsigned int i = 0;
   while(i < nums.size() - 1) {
      if (nums[i] == nums[i + 1]) {
         nums.erase(nums.begin() + i);
      } 
      else i++;
   }
   return nums.size();
}
Run Code Online (Sandbox Code Playgroud)