Maison >développement back-end >C++ >La comparaison des itérateurs de différents conteneurs a-t-elle un comportement défini en C ?
Comparaison des itérateurs de différents conteneurs en C
Dans le contexte de l'implémentation d'itérateurs personnalisés, une question fondamentale se pose : est-il permis de comparer des itérateurs à partir de conteneurs distincts ? Prenez, par exemple, l'extrait de code suivant :
<code class="cpp">std::vector<int> foo; std::vector<int> bar; // Is this expression valid? foo.begin() == bar.begin();</code>
Selon la norme C 11 :
Itérateurs dans la même séquence :
Comparaison des itérateurs de différents conteneurs :
Par conséquent, comparer des itérateurs de différents conteneurs, tels que foo.begin() et bar.begin() dans l'exemple ci-dessus, est considéré comme un comportement non défini.
Ce comportement non défini découle du fait que les itérateurs font référence à des éléments spécifiques dans un conteneur. Lorsque les itérateurs appartiennent à des conteneurs différents, on ne peut pas supposer qu'ils pointent vers des éléments dans la même séquence sous-jacente, leur comparaison donne donc des résultats indéfinis.
LWG Issue #446 :
Pour clarifier ce problème, le numéro 446 du LWG a proposé d'ajouter le texte suivant à la norme :
Le résultat de l'évaluation directe ou indirecte d'une fonction de comparaison ou de l'opérateur binaire - avec deux valeurs d'itérateur comme arguments obtenus à partir de deux plages différentes... n'est pas défini, sauf indication contraire explicite.
Cet ajout souligne encore la nature indéfinie de la comparaison d'itérateurs de conteneurs distincts.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!