我正在开发一个包含树数据结构的项目,树中的每个节点都存储指向矢量中子节点的指针。在我的一个函数中,我试图使用迭代器遍历向量,但为了使它工作,我必须将解除引用的迭代器分配给一个临时变量:
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类的指针?
答案 0 :(得分:1)
根据Operator Precedence,operator->
的优先级高于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
{
// ...
}
}
击> <击> 撞击>