引用绑定到类型 "std::vector<int, std::allocator<int>>" 的空指针



你好,我这里有这个代码:

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<int,std::分配器>quot

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

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

谢谢你的帮助。

vector<vector<int>> output;

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

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

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

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

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

vector<vector<int>> output;

然后

out[level].push_back ...;

你会得到未定义的行为。

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

最新更新