【问题标题】:C++ vector with unlimited dimensions具有无限维度的 C++ 向量
【发布时间】:2015-02-17 10:56:03
【问题描述】:

我正在为解释器制作解析树。这是我树中节点的代码:

struct rtok {
    std::string type;
    std::string val;
};

struct rnode  {
    rtok tok;
    vector<rnode> child;
} node;

vector<rnode> ptree;

树一直有效,直到我尝试在“node.child”上使用“push_back()”,即node.child[0].push_back();

“rtok”只是我为存储令牌而制作的自定义结构,我只是为了使示例更完整而包含它。

我认为node.child[0].push_back(); 不起作用的原因是因为保存解析树的基向量(ptree)只有一维。所以我的问题是,有没有办法让 C++ 根据需要动态向ptree 向量添加新维度?

--编辑--

我省略了向向量添加新节点的功能:

void add_term(rtok tok) {
    rnode n;
    n.tok = tok;
    ptree.back().child.push_back(n);
}

【问题讨论】:

    标签: c++ vector compiler-construction interpreter abstract-syntax-tree


    【解决方案1】:

    node.child[0] 在您创建之前不存在。在创建node 之后,node.child 将是一个空向量,因此访问第一个(通过[0])是未定义的。

    要让它工作,给child一个初始大小或添加元素,然后使用它们:

    node.child.push_back(rnode());
    node.child[0].push_back(...);
    

    【讨论】:

    • 这是我首先想到的,但我有一个函数可以将新术语添加到向量中,我首先运行它,所以 node.child 向量中应该已经有 1 个项目。我已经用这个函数更新了我的问题。
    【解决方案2】:

    我的错!我试图在不引用 node 结构的子元素的情况下将项目插入向量中。

    即我正在这样做:

    ptree.back().child[0].push_back(n);
    

    什么时候我应该这样做:

    ptree.back().child[0].child.push_back(n);
    

    【讨论】:

    • 请不要发布 cmets 作为答案。
    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    相关资源
    最近更新 更多