Leetcode刷题bug记录

错误类型

      • 1.runtime error: reference binding to null pointer of type 'std::vector

1.runtime error: reference binding to null pointer of type ‘std::vector’ (stl_vector.h)

这是在完成Leetcode102题:Binary Tree Level Order Traversal时遇到的问题。翻译过来大致意思是引用绑定到了空的指针上。
源代码,采用递归思想:

class Solution{
     
public:
    vector<vector<int>> levelOrder(TreeNode* root){
     
        vector<vector<int>> result;
        int num = 0;
        traversal(root, result, num);
        return result;
    }
    void traversal(TreeNode* tree, vector<vector<int>>& res, int level)
    {
     
        if(tree == NULL) return;
        res[level].push_back(tree->val);
        traversal(tree->left, res, level+1);
        traversal(tree->right, res, level+1);
    }
};

问题原因:
1.未能对res实现扩容。使level增大后res[level]越界。

vector容器具备自动扩容的功能,但是res[level].push_back()只能对res[level]进行扩容,而不能对res进行扩容。当level超过容器容量时,会出现越界提示。

解决方案:
增添代码行:

if (level >= res.size())
     res.push_back(vector<int>());

使容器在必要的时候进行扩容,避免下标越界。

2.在类中定义vector报错:expected parameter declarator

在完成力扣 剑指offer51时,在类中对临时数组初始化:

class Solution {
     
public:
    vector<int> tmp(50000, 0);//该句报错
    ...
}

在类中需要优先声明,因此编译器对vector tmp(50000, 0)语句,认为是声明成员函数tmp,返回值类型为vector,函数存在两个参数,但是参数的声明错误。
在类中正确初始化方式:

//1
vector<int> tmp = vector<int>(50000, 0);
//2
vector<int> tmp;
tmp.reverse(50000);
//3
vector<int> tmp{
     vector<int>(50000, 0)};

3.类中自定义sort报错

class Solution {
     
public:
    bool comp(const int &x, const int &y){
     
		...
	}
	
    string largestNumber(vector<int>& nums) {
     
    ...
        sort(intervals.begin(),intervals.end(),cmp);
    ...
}		

错误类型:error: reference to non-static member function must be called sort(th[i].begin(), th[i].end(), comp); ^~~~ 1 error generated.
在类内定义的非static成员函数在经过编译后隐式的为他们添加了一个this指针参数。但是这和标准库sort函数第三个参数cmp不匹配,因此需要加上static,使得自定义比较函数成为一个类的静态成员函数,则可不需要this指针即可访问。

static bool comp(const int &x, const int &y)

你可能感兴趣的:(leetcode刷题,leetcode)