Warum druckt das end () -Element im assoziativen Container denselben Wert wie das letzte Element? [Duplikat]

Dec 10 2020

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

6 TonyTannous Dec 10 2020 at 20:53

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.

1 largest_prime_is_463035818 Dec 10 2020 at 20:55

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 endIterator 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.

AsteroidsWithWings Dec 10 2020 at 21:01

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 NULLZeichen abgeschlossen, nach dem Sie suchen können, das aber NULLimmer noch Teil eines Arrays von charObjekten 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.