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

时间:2017-12-22 22:16:26

标签: 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();
    }
};

6 个答案:

答案 0 :(得分:9)

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

要解决此问题,您可以抢先将nums.size()强制转换为int,或将大小存储在整数变量中并与之进行比较。

答案 1 :(得分:2)

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

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

while(i < nums.size() - 1)
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();
}

答案 2 :(得分:2)

这不是您的问题的答案,但如果您不必在每次找到重复时调整矢量大小,那么这将是解决问题的更有效方法。只是为了给你一个想法,你可以有两个迭代器i和j,我保持解决方案向量的最后一个独特元素的索引,并且j迭代向量。当j指向不在前i个元素中的值时,将其复制到v [i]。完成后,从第j个位置开始删除所有内容。

答案 3 :(得分:0)

在我的情况下,此错误消息的原因是分段错误。

示例 对于空输入:

string longestCommonPrefix(vector<string>& strs) { 
    auto start = strs[0];

当我添加空输入检查时,效果很好

string longestCommonPrefix(vector<string>& strs) {
        if (strs.size() == 0) {
            return "";
        }
    auto start = strs[0];

答案 4 :(得分:0)

class Solution {
  public:
    int removeDuplicates(vector < int > & nums) {
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i] == nums[i - 1]) {
                nums.erase(nums.begin() + i);
                i--;
            }
        }
        return nums.size();
    }
};

答案 5 :(得分:-1)

我只是想出了这一点,而不是直接将num.size()与任何整数进行比较或运算 首先存储int n=num.size();,然后像if(num=n-2)进行比较。