2016-02-03 1 views
1

I ont récemment écrit une implémentation pour une simple liste liée, et à plusieurs reprises dans mon code, il ressemble àLisibilité pour-boucles sans compteurs

Node* current_node = head; 
while (current_node != nullptr) { 
    if (current_node->data == query) { 
    // perform some action 
    break; 
    } 
current_node = current_node->next; 
} 

Et je viens récemment pensé que je pouvais à nouveau mettre en œuvre ce que

for (Node* current_node = head; current_node != nullptr; current_node = current_node->next) { 
    if (current_node->data == query) { 
    // perform some action 
    break; 
    } 
} 

Je sais que les deux sont syntaxiquement correct, et que les différences de rendement devraient être négligeables, mais je me demandais si avoir une condition d'égalité dans le contrôle est généralement mis en œuvre dans une boucle for? Auparavant, je n'avais utilisé que des inégalités (ex:>, <, etc.) dans les boucles for-loops. Quelle version est plus conventionnelle/lisible?

+0

Les deux ont des contrôles d'égalité, quelle est la différence w.r.t le titre de votre question? Les vérifications d'égalité sont parfaites, et l'utilisation d'une boucle for plutôt que d'une boucle while équivalente est probablement plus facile à lire pour la plupart des gens. Il n'y a pas de différence de performance. Faites ce que vous trouvez le plus facile à lire et c'est correct. – GManNickG

+2

'current_node-> data! = Query' peut être tout à fait dans la condition de boucle. Juste '&&' ça. Ensuite, vous utilisez simplement 'current_node' après la boucle. – LogicStuff

+0

@LogicStuff Est-il important que 'current_node-> data' entraîne une lecture invalide si' current_node == nullptr' ou est-ce que cela serait couvert par la commande de l'opérateur '&&? – Aposhian

Répondre

0

Ce n'est pas une mauvaise pratique en boucle à travers une liste chaînée par boucle for, mais vous pouvez l'améliorer à:

std::list<type> list; 
auto it = std::find(begin(list), end(list), query); 
if (it != end(list)) 
    // perform some action 
+0

Merci, mais le but de ce code était de m'entraîner à définir mon propre conteneur à partir de zéro. Sinon, j'aurais utilisé std :: list. – Aposhian

+0

@Aposhian Content de l'entendre. – Shoe