2016-08-03 5 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())과 같으며 컴파일러는 다음과 같습니다. ns는 p->m_board.isComplete()입니다.

당신 수 if (*p->m_board.isComplete())은 C++에서 멤버 액세스 연산자 ->는 단항 (또는 소위 역 참조) * 연산자보다 higher precedence을 가지고 있기 때문에입니다 실패 이유

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

. 는 사용할 수 없습니다 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

요점은 iterator가 포인터를 가리키고 있기 때문에'operator * '를 사용하여 역 참조를하고'operator->'를 사용해야한다는 것입니다. iterator는'Node **'처럼 이미지 할 수 있습니다. BTW : 난 downvoter 아니에요. :) – songyuanyao

+0

@songyuanyao, 오, 알겠습니다. 내 감독은 ...--). 감사. – WhiZTiM