首页 > 解决方案 > 如何修复leetcode中的“运行时错误:引用绑定到'value_type'(stl_vector.h)类型的空指针”?

问题描述

我正在做 leetcode 376. Wiggle 子序列。测试输入 [1,7,4,9,2,5] 的第一个实例时出错。它显示“第 922 行:字符 34:运行时错误:引用绑定到类型为 'value_type' (stl_vector.h) 的空指针”。谁能告诉我出了什么问题?非常感谢!

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if(nums.size() < 2){
            return nums.size();
        }
        std::priority_queue<int> big_heap;
        vector<int> flag;
        int result;
        int length = nums.size();
        for(int i = 0; i + 1 < length; i++){
            if(nums[i+1] > nums[i]){
            flag[i] = 1;
                }
            else if(nums[i+1] < nums[i]){
                flag[i] = -1;
            }
            else{
                flag[i] = 0;
            }
        }
        int count = 1;
        for(int i = 0; i + 2 < length;i++){
            cout <<flag[i]<<endl;
            if(flag[i] + flag[i+1] == 0){
                count ++;
            }
            else{
                big_heap.push(count);
                count = 1;
            }
        }
        big_heap.push(count);
        result = big_heap.top() + 1;
        return result;

    }
};

标签: c++

解决方案


您有未定义的行为,因为您正在访问flagwhile 它具有 size的元素0

如果你想给flag[i]你写信,首先需要有一个ith 元素flag。如果您事先知道,您可以通过调整flag所需长度来实现这一点。在您的情况下,您似乎将拥有确切的length-1元素,因此您可以这样做

flag.resize(length-1);

或者,如果您将声明移到 of 之后length,您可以直接使用std::vectors 构造函数来执行此操作:

std::vector<int> flag(length-1);

或者,您可以使用push_back在向量末尾插入元素,如果您只是按顺序编写新元素,就像您在这里所做的那样,例如,而不是flag[i] = 1;

flag.push_back(1);

推荐阅读