Maison  >  Article  >  développement back-end  >  Est-il valide de comparer des itérateurs de différents conteneurs en C ?

Est-il valide de comparer des itérateurs de différents conteneurs en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-02 09:02:291002parcourir

Is It Valid to Compare Iterators from Different Containers in C  ?

Comparaison des itérateurs de conteneurs distincts

Lorsque vous travaillez avec des conteneurs, il est essentiel de comprendre les implications de la comparaison des itérateurs de différents conteneurs. La question se pose : est-il permis de comparer des itérateurs appartenant à des conteneurs distincts ?

Considérez le code suivant :

<code class="cpp">std::vector<int> foo;
std::vector<int> bar;
std::cout << (foo.begin() == bar.begin());</code>

L'expression foo.begin() == bar.begin() donner des résultats faux ou conduire à un comportement indéfini ?

Plonger dans la norme C 11 (n3337) peut faire la lumière sur ce point dilemme :

Itérateurs dans la même séquence

  • La section 24.2.1 indique que deux itérateurs, i et j, sont considérés comme accessibles s'il existe une séquence finie de i opérations qui rendent i égal à j.
  • Si j est accessible depuis i, elles font référence à des éléments du même séquence.

Comparaison des itérateurs de différents conteneurs

  • Les ForwardIterators, qui incluent RandomAccessIterators, sont soumis à la section 24.2.5.
  • Cette section précise que == ne peut être utilisé que pour comparer des itérateurs sur le même sous-jacent séquence.

Compte tenu de ces exigences, comparer des itérateurs de différents conteneurs est un comportement indéfini.

LWG Issue #446

LWG Issue #446 aborde explicitement cette question, en proposant l'ajout suivant à la norme :

"Le résultat de l'évaluation directe ou indirecte de toute comparaison fonction ou l'opérateur binaire - avec deux valeurs d'itérateur comme arguments qui ont été obtenues à partir de deux plages différentes r1 et r2 [...] qui ne sont pas des sous-plages d'une plage commune n'est pas défini, sauf indication contraire explicite. "

En conclusion, comparer des itérateurs de conteneurs distincts est un comportement indéfini, et il est crucial de respecter cette contrainte lors de l'écriture d'itérateurs personnalisés et de la manipulation de conteneurs dans votre code.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn