Pourquoi l'élément end () du conteneur associatif affiche-t-il la même valeur que le dernier élément? [dupliquer]

Dec 10 2020

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

6 TonyTannous Dec 10 2020 at 20:53

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.

1 largest_prime_is_463035818 Dec 10 2020 at 20:55

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' endité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.

AsteroidsWithWings Dec 10 2020 at 21:01

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 NULLcaractère que vous pouvez vérifier, mais qui NULLfait toujours partie d'un tableau d' charobjets, 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.