Je travaille avec un Je veux tester si Jusqu'à présent je fais maintenant; p> Cependant, l'opérateur est-ce valide selon la spécification? Quelqu'un a-t-il une expérience pratique avec les implémentations de cela? IMHO, le code devient plus clair et éventuellement une infime amélioration de la performance pourrait être réalisée. P> P> std :: map
my_map.find (clé) code > renvoyé un pointeur spécifique. P>
code> de l'itérateur est nécessaire pour renvoyer une référence. Intuitivement, je suppose que cela soit valide et complètement initialisé? Si oui,
my_map.end () -> secondaire code> serait
null code>, et (car
null code> n'est jamais attendu), je pourrais réduire mon si Déclaration à: p>
4 Réponses :
Cependant, l'opérateur * de l'itérateur est tenu de renvoyer une référence. Intuitivement, je suppose que cela soit valide et complètement initialisé? P> blockQuote>
Votre hypothèse est fausse, la déséroférence itératrice qui pointe en dehors du conteneur mènera à UB. P>
24.2 Conditions d'itérateur [Itérateur.requirements] H1>
24.2.1 En général [itérateur.requirs.General] h2>
7 La plupart des modèles algorithmiques de la bibliothèque qui fonctionnent sur les structures de données ont des interfaces qui utilisent des gammes. Une gamme est une paire d'itérateurs désignant le début et la fin du calcul. Une fourchette [i, i) est un plage vide; En général, une plage [I, J) fait référence aux éléments de la structure de données commençant par l'élément indiqué par I et jusqu'à n'incluant pas l'élément pointé par j. strong> gamme [i, j) est valide si et seulement si J est accessible de i. Le résultat de l'application de fonctions dans la bibliothèque à des gammes non valides est indéfini. strong> p> blockQuote>
Intuitivement, je suppose que cela soit valide et complètement initialisé? P> blockQuote>
Vous ne pouvez pas supposer un itérateur à un élément passé - l'extrémité d'un conteneur pour être latéralable. Paragraphe 24.2.1 / 5 de la norme C ++ 11: P>
Tout comme un pointeur régulier sur un tableau garantit qu'il existe une valeur de pointeur pointant après le dernier élément du tableau, donc pour tout type d'itérateur, il existe une valeur itératrice qui passe devant le dernier élément d'un séquence correspondante. Ces valeurs sont appelées valeurs passées-finales. Valeurs d'un itérateur
i code> pour lequel le L'expression
* i code> est définie est appelée désirférence. la bibliothèque ne suppose jamais que les valeurs passées de bout sont Dérofiance. strong> [...] p> blockQuote>
Merci. Très instructif, et voir l'analogue de l'itérateur-pointeur aide vraiment à saisir le concept.
@Rawler: content que cela vous ait aidé
si iter == my_map.end () code>, puis la déséroférance est un comportement indéfini; Mais tu ne fais pas ça ici.
if ( p != NULL && *p == 4 ) {}
Même sans vérifier les spécifications, vous pouvez facilement voir que la déséroférance d'un itérateur à Une implémentation parfaitement naturelle (la mise en oeuvre de facteur em> standard pour Vous ne pouvez pas éventuellement être autorisé à désirer l'itérateur fin code> doit être invalide. P>
vecteur <> code>) est pour
fin () code> pour être littéralement une mémoire Pointeur qui a une valeur de
PTR_LAST_ELEMENT + 1 code>, c'est-à-dire la valeur du pointeur qui indiquerait à l'élément suivant - s'il y avait un élément suivant. P>
extrémérateur code> car il pourrait s'agir d'un pointeur qui finirait de pointer vers l'objet suivant dans le tas, ou peut-être une zone de garde de débordement (donc vous le feriez Dréréférence mémoire aléatoire) ou au-delà de la fin du tas, et éventuellement à l'extérieur de l'espace mémoire du processus, auquel cas vous pourriez avoir une exception d'infraction d'accès lorsque la déséroférance). P>