2016-08-03 30 views
0

我正在处理一个包含树数据结构的项目,树中的每个节点都存储指向向量中的子节点的指针。在我的功能之一,我通过矢量使用迭代器试图循环,但要得到它的工作,我要提领迭代器这样分配给一个临时变量:为什么我需要将这个解除引用的迭代器赋值给一个临时值?

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类的指针吗?

回答

1

根据Operator Precedence,operator->优先于operator*,则*p->m_board.isComplete()等于*(p->m_board.isComplete()),编译器抱怨那p->m_board.isComplete()是不合格的。

你可以

if ((*p)->m_board.isComplete()) 
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 
    { 
     // ... 
    } 
} 

+0

不,它不能用“直”。你试过了吗? http://rextester.com/ZCZWLA76469 – songyuanyao

+0

关键是迭代器在这里指向一个指针,所以你必须使用'operator *'来解引用它,然后使用'operator->'。您可以在这里映像迭代器像'Node **'一样工作。顺便说一句:我不是downvoter。 :) – songyuanyao

+0

@songyuanyao,哦,我知道了,我的疏忽...... :-)。谢谢。 – WhiZTiM

相关问题