2016-08-03 7 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()), компилятор complai ns, что 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 «s итератора перегруженный ->, который может быть использован непосредственно

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 ** 'здесь. BTW: Я не сторонник. :) – songyuanyao

+0

@songyuanyao, О, я понимаю, мой надзор ... :-). Благодарю. – WhiZTiM