Pourquoi l'élément end () du conteneur associatif affiche-t-il la même valeur que le dernier élément? [dupliquer]
Dans le code ci-dessous, la valeur vers laquelle pointe l'itérateur est la même pour le dernier et l'avant-dernier élément.
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> s1 = {4,3,2,5,1};
set<int>::iterator i;
i = s1.end();
cout << *i << endl; // 5
i--;
cout << *i << endl; // 5
cout << *s1.end() << endl; // 5
cout << *(--s1.end()) << endl; // 5
return 0;
}
Dans ma compréhension, la valeur pointée par l'élément de fin doit être nulle. Pourquoi cela est-il ainsi?
Réponses
Vous avez appelé un comportement indéfini, std :: set :: end
Renvoie un itérateur vers l'élément suivant le dernier élément de l'ensemble. Cet élément agit comme un espace réservé; tenter d'y accéder entraîne un comportement indéfini.
Un comportement indéfini rend le programme entier sans signification.
Dans ma compréhension, la valeur pointée par l'élément de fin doit être nulle. Pourquoi cela est-il ainsi?
Pourquoi votre compréhension est fausse, je ne peux pas le dire;). Mis à part Snarkyness: Non. Il n'y a pas d '"élément final". L' end
itérateur pointe vers un après le dernier élément. Vous ne pouvez pas le déréférencer. Si vous le faites, vous invoquez un comportement non défini.
Le dernier élément d'un conteneur est généralement appelé «arrière» et de nombreux conteneurs ont une back()
méthode pour y accéder.
Dans ma compréhension, la valeur pointée par l'élément de fin doit être nulle. Pourquoi cela est-il ainsi?
Ça ne l'est pas.
L'itérateur un-après-la-fin ne "pointe" vers rien; ce n'est pas déréférencable.
Les chaînes C peuvent apparaître au début comme une exception à cette règle, mais ce n'est pas le cas: elles se terminent logiquement par un NULL
caractère que vous pouvez vérifier, mais qui NULL
fait toujours partie d'un tableau d' char
objets, et vous ne pouvez pas déréférencer un char*
c'est l'itérateur un-après-la-fin pour ce tableau. Considérez le terminateur nul d'une chaîne C comme une «page délibérément laissée vide»; la page ne vous donne plus d'histoire, mais c'est toujours une page.
Pourquoi l'élément end () du conteneur associatif affiche-t-il la même valeur que le dernier élément?
C'est un résultat possible d'un programme avec un comportement indéfini.