博客
关于我
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/

    你可能感兴趣的文章
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
    查看>>
    NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
    查看>>
    NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_实际操作---大数据之Nifi工作笔记0020
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
    查看>>