博客
关于我
Leetcode刷题bug记录
阅读量:384 次
发布时间:2019-03-05

本文共 2963 字,大约阅读时间需要 9 分钟。

在编程过程中,尤其是在使用C++和处理算法时,常常会遇到各种错误。以下是三个常见错误及其解决方案的详细分析,帮助开发者更好地理解问题并找到解决方法。

1. runtime error: reference binding to null pointer of type ‘std::vector<int, std::allocator
>’

问题描述:

在Leetcode 102题“二叉树的层序遍历”中使用递归实现时遇到问题。翻译过来,错误信息大致是“引用绑定到了空的指针上”。具体来说,是在处理树节点的左、右子节点时,出现了一个空向量越界的问题。

源代码分析:

#include 
using namespace std;class Solution {public: vector
levelOrder(TreeNode* root) { vector
res; int num = 0; traversal(root, res, num); return res; } void traversal(TreeNode* tree, vector
& 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); }};

问题原因:

  • 未能对res进行扩容。当级别(level)超过res的大小时,访问res[level]会导致越界。
  • 向量的扩容机制只会根据push_back等操作自动扩容,而不能在访问时自动扩容。
  • 解决方案:

    在每次访问res[level]之前,检查当前级别是否超过res的大小,如果超过,则扩容res,添加一个新的空向量。这样可以避免越界问题。

    修改后的代码:

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

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

    问题描述:

    在力扣(剑指offer51)中,在类中对临时数组进行了初始化,但编译器报错,提示“expected parameter declarator”。

    源代码分析:

    class Solution {public:    vector
    tmp(50000, 0); // 这一行报错};

    问题原因:

    在类中直接写vector

    tmp(50000, 0); 会被编译器解释为一个成员函数的声明,而不是对向量的初始化。因为类中的每个成员函数都需要一个参数声明,而这里的语法结构不符合。

    解决方案:

    使用两种方法之一来正确初始化向量:

  • 在类中先声明变量,再初始化:
  • class Solution {public:    vector
    tmp;};

    在类外或构造函数中初始化:

    class Solution {public:    Solution() {        tmp = vector
    (50000, 0); } vector
    tmp;};
    1. 使用统一初始化语法:
    2. class Solution {public:    vector
      tmp {50000, 0};};

      3. 类中自定义sort报错:“reference to non-static member function must be called”

      问题描述:

      在类中定义了一个自定义比较函数,然后在类中调用了sort函数,编译器报错,提示“引用到非静态成员函数必须通过对象调用”。

      源代码分析:

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

      问题原因:

      在类中定义了一个非静态成员函数comp,但在调用sort时,传递的是一个函数对象cmp,而不是类的成员函数。由于cmp是非静态成员函数,它需要一个隐式的this指针,而标准库的sort函数不接受this指针,因此会报错。

      解决方案:

      将比较函数定义为静态成员函数,这样在调用时不需要传递this指针:

      class Solution {public:    static bool comp(const int& x, const int& y) {        // 函数体    }    string largestNumber(vector
      & nums) { sort(intervals.begin(), intervals.end(), comp); // ... }};

      总结:

      通过以上方法,可以避免常见的C++编程错误。记住,在类中定义和使用成员函数时,需要注意静态关键字的使用;在向量扩容时,需要主动检查当前级别是否超过向量的大小,避免越界。

    转载地址:http://kuxwz.baihongyu.com/

    你可能感兴趣的文章
    Nginx之二:nginx.conf简单配置(参数详解)
    查看>>
    Nginx代理websocket配置(解决websocket异常断开连接tcp连接不断问题)
    查看>>
    Nginx代理初探
    查看>>
    nginx代理地图服务--离线部署地图服务(地图数据篇.4)
    查看>>
    Nginx代理外网映射
    查看>>
    Nginx代理模式下 log-format 获取客户端真实IP
    查看>>
    Nginx代理解决跨域问题(导致图片只能预览不能下载)
    查看>>
    Nginx代理配置详解
    查看>>
    Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
    查看>>
    Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
    查看>>
    nginx反向代理
    查看>>
    nginx反向代理、文件批量改名及统计ip访问量等精髓总结
    查看>>
    Nginx反向代理与正向代理配置
    查看>>
    Nginx反向代理及负载均衡实现过程部署
    查看>>
    Nginx反向代理是什么意思?如何配置Nginx反向代理?
    查看>>
    nginx反向代理解决跨域问题,使本地调试更方便
    查看>>
    Nginx反向代理配置
    查看>>
    Nginx启动SSL功能,并进行功能优化,你看这个就足够了
    查看>>
    nginx启动脚本
    查看>>
    Nginx在Windows上和Linux上(Docker启动)分别配置基本身份认证示例
    查看>>