Maison > développement back-end > C++ > 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
Libérer: 2024-11-02 09:02:29
original
1064 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal