【问题标题】:Reference binding to null pointer of type "std::vector<int, std::allocator<int>>"对“std::vector<int, std::allocator<int>>”类型空指针的引用绑定
【发布时间】:2021-05-31 15:30:36
【问题描述】:

您好,我这里有这段代码:

class Node {
public:
   int val;
   vector<Node*> children;

   Node() {}

   Node(int _val) {
       val = _val;
   }

   Node(int _val, vector<Node*> _children) {
       val = _val;
       children = _children;
   }
};


class Solution {
public:
   vector<vector<int>> levelOrder(Node* root) {
       vector<vector<int>> output;
       Calculate(root, 0, output);
       return output;
   }
private:
   void Calculate(Node* root, int level, vector<vector<int>>& out)
   {
       out[level].push_back(root->val);
       for(u_int i = 0; i < root->children.size(); i++)
       {
           if(root->children[i]!=nullptr)
               Calculate(root->children[i], level+1, out);
       }           
   }
};

输入是长度为 n 的 n 叉树。我正在尝试将值写入相应的向量。每个向量都是树的级别,每个向量中都有另一个向量,其中填充了树当前级别的数字。

但是当我运行代码时,我得到了这个错误:引用绑定到类型为“std::vector”的空指针

我对 C++ 有点陌生,所以我不知道如何解决它。我尝试用一​​些逻辑来做它并询问节点是否为空,但这似乎不是问题。

这里有问题:https://leetcode.com/problems/n-ary-tree-level-order-traversal/

感谢您的任何帮助。

【问题讨论】:

标签: c++ pointers


【解决方案1】:
   vector<vector<int>> output;

这声明了一个向量,一个空向量。向量绝对不包含任何内容。它的大小为 0。然后,该向量作为参数传递给函数,其中会发生以下情况:

   out[level].push_back(root->val);

由于此向量完全为空,out[level] 会导致未定义的行为。 [] 运算符,在 C++ 中,必须指定向量中现有元素的索引。例如,使用[4] 时,底层向量必须至少有五个值。

这里,由于向量是空的,没有向量索引是有效的,上面的代码会导致未定义的行为,这可能是你崩溃的原因。

[](带有std::vector)不会为向量创建或添加值。它访问向量中的现有值,您有责任确保[] 运算符存在。

【讨论】:

    【解决方案2】:
    vector<vector<int>> output;
    

    然后

    out[level].push_back ...;
    

    你得到未定义的行为。

    如果你使用默认构造函数创建向量,它的大小为零,你不能像这样用括号索引它。首先使用std::vector::resize 将向量调整为所需的大小。您可以反复调整(放大)矢量的大小而不会丢失现有内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多