为什么我需要将此解除引用的迭代器分配给临时值?

时间:2016-08-03 03:59:42

标签: c++ vector iterator nodes dereference

我正在开发一个包含树数据结构的项目,树中的每个节点都存储指向矢量中子节点的指针。在我的一个函数中,我试图使用迭代器遍历向量,但为了使它工作,我必须将解除引用的迭代器分配给一个临时变量:

std::vector<Node*>::iterator p;
for (p = n->children.begin(); p < n->children.end(); p++)
{
    Node* t = *p;
    // if board is complete, mark as such and update score
    if (t->m_board.isComplete())
    {
        // ...
    }
}

如果我尝试编写没有临时值的相同代码:if (*p->m_board.isComplete())那么我得到错误消息“表达式必须具有指向类的类型。是不是这样?不应解除引用我的迭代器返回指向我的Node类的指针?

2 个答案:

答案 0 :(得分:1)

根据Operator Precedenceoperator->的优先级高于operator*,然后*p->m_board.isComplete()等同于*(p->m_board.isComplete()),编译器抱怨p->m_board.isComplete()是不良形成。

你可以

if ((*p)->m_board.isComplete()) 

答案 1 :(得分:0)

为什么if (*p->m_board.isComplete())失败是因为在C ++中,成员访问运算符->比一元(或所谓的解除引用)*运算符具有higher precedence。对于这种情况,请使用大括号来说明您的优先级:if ((*p)->m_board.isComplete()) { ... }

<击> std::vector迭代器有一个可以直接使用的重载->

std::vector<Node*>::iterator p;
for (p = n->children.begin(); p < n->children.end(); p++)
{
    // Node* t = *p; ....No need
    if (p->m_board.isComplete())  //This should work
    {
        // ...
    }
}

<击>