Warum druckt das end () -Element im assoziativen Container denselben Wert wie das letzte Element? [Duplikat]
Im folgenden Code ist der Wert, auf den der Iterator zeigt, für das letzte und das vorletzte Element gleich.
#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;
}
Nach meinem Verständnis sollte der Wert, auf den das Endelement zeigt, null sein. Warum ist das so?
Antworten
Sie haben das undefinierte Verhalten std :: set :: end aufgerufen
Gibt einen Iterator an das Element zurück, das auf das letzte Element der Menge folgt. Dieses Element fungiert als Platzhalter. Der Versuch, darauf zuzugreifen, führt zu undefiniertem Verhalten.
Undefiniertes Verhalten macht das gesamte Programm bedeutungslos.
Nach meinem Verständnis sollte der Wert, auf den das Endelement zeigt, null sein. Warum ist das so?
Warum dein Verständnis falsch ist, kann ich nicht sagen;). Snarkyness beiseite: Nein. Es gibt kein "Endelement". Der end
Iterator zeigt auf eins nach dem letzten Element. Sie können es nicht dereferenzieren. Wenn Sie dies tun, rufen Sie undefiniertes Verhalten auf.
Das letzte Element in einem Container wird normalerweise als "Zurück" bezeichnet, und viele Container verfügen über eine back()
Methode, um darauf zuzugreifen.
Nach meinem Verständnis sollte der Wert, auf den das Endelement zeigt, null sein. Warum ist das so?
Ist es nicht.
Der One-Past-The-End-Iterator "zeigt" auf nichts; es ist nicht dereferencable.
C-Strings scheinen zunächst eine Ausnahme von dieser Regel zu sein, sind es aber nicht: Sie werden logisch durch ein NULL
Zeichen abgeschlossen, nach dem Sie suchen können, das aber NULL
immer noch Teil eines Arrays von char
Objekten ist, und Sie können a nicht dereferenzieren char*
Das ist der One-Past-The-End-Iterator für dieses Array. Stellen Sie sich den Nullterminator eines C-Strings als "diese Seite wurde absichtlich leer gelassen" vor. Die Seite gibt dir keine Geschichte mehr, aber es ist immer noch eine Seite.
Warum druckt das end () -Element im assoziativen Container denselben Wert wie das letzte Element?
Dies ist ein mögliches Ergebnis eines Programms mit undefiniertem Verhalten.