Как выполнить кусок кода, если не выполняется условие al oop? - PullRequest
0 голосов
/ 23 апреля 2020

Предположим, у меня есть дерево, и я хочу продолжать движение влево от текущего узла. И если от текущего узла нет левых, я хочу продолжать идти направо. в противном случае вернитесь. Чтобы сделать что-то подобное, мне нужно написать что-то вроде этого:

if (node->left != nullptr)
    while (node->left != nullptr)
        node = node->left;
else if (node->right != nullptr)
    while (node->right != nullptr)
        node = node->right;
else return;

Как видите, мне пришлось написать условие дважды. Могу ли я написать что-то вроде этого:

while (node->left != nullptr)
    node = node->left;
else while (node->right != nullptr)
    node = node->right;
else return;

Также было бы полезно, если бы я мог использовать с if. Примерно так:

while (...) ...
else if (...) ... 
else while (...) ...
else ...

Редактировать: Просто понял, что пример деревьев не очень хороший. Но вообще я могу сделать что-то подобное или нет?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Я имею в виду, это будет делать то, что вы просите

if (node->left != nullptr)
    while (node->left != nullptr)
        node = node->left;
else if (node->right != nullptr)
    while (node->right != nullptr)
        node = node->right;
else return;

, но, возможно, лучше проверить, что node не nullptr (если вы не делали раньше)

if (node && node->left != nullptr)
    while (node->left != nullptr)
        node = node->left;
else if (node && node->right != nullptr)
    while (node->right != nullptr)
        node = node->right;
else return;
0 голосов
/ 23 апреля 2020

Да, это, конечно, возможно в этом случае. На самом деле, вы даже можете избежать написания if и while дважды.

Обратите внимание, что единственное различие между фрагментами кода заключается в , который Node элемент используется (т.е. вы разветвляетесь влево или вправо). Таким образом, в зависимости от того, какой ветке вы хотите следовать, вы можете взять указатель на этот член, например:

Node* Node::* branch = node->left != nullptr ? &Node::left : &Node::right;

, а затем безоговорочно следовать этой ветви, например:

while (node->*branch != nullptr)
    node = node->*branch;

В общем случае, когда у вас есть два одинаковых фрагмента кода, вы должны в каждом конкретном случае решать, какие его части можно абстрагировать, и будет ли улучшенный в результате код улучшен или нет.

...