2016-08-03 66 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

相關問題