对“std::vector<int, std::allocator<int>>”类型空指针的引用绑定
Posted
技术标签:
【中文标题】对“std::vector<int, std::allocator<int>>”类型空指针的引用绑定【英文标题】:Reference binding to null pointer of type "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/
感谢您的任何帮助。
【问题讨论】:
请创建minimal reproducible example 并显示您为程序提供的输入。 我不是 100% 输入的样子,但我编辑了帖子,添加了问题的链接及其对输入的解释。这是链接:leetcode.com/problems/n-ary-tree-level-order-traversal 【参考方案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 将向量调整为所需的大小。您可以反复调整(放大)矢量的大小而不会丢失现有内容。
【讨论】:
以上是关于对“std::vector<int, std::allocator<int>>”类型空指针的引用绑定的主要内容,如果未能解决你的问题,请参考以下文章
运行时错误:引用绑定到“std::vector<int, std::allocator<int> >”类型的空指针 (stl_vector.h)