Was passiert mit einem STL-Iterator nach dem Löschen in VS, UNIX / Linux?

7

Bitte beachten Sie das folgende Szenario:

%Vor%

Mir scheint, dass in VS2005, nach dem "Erase", der Iterator gleich end () ist, daher der Absturz beim Versuch, ihn zu inkrementieren. Gibt es wirklich Unterschiede zwischen den Compilern in dem hier vorgestellten Verhalten? Wenn ja, was wird der Iterator nach dem "Löschen" gleich unter UNIX / Linux sein?

Danke ...

    
Gal Goldman 11.01.2009, 16:33
quelle

4 Antworten

20
___ antwort433207 ___

Ja, wenn Sie einen Iterator löschen, erhält dieser Iterator einen sogenannten singulären Wert , was bedeutet, dass er nicht mehr zu einem Container gehört. Sie können sie nicht mehr erhöhen, dekrementieren oder auslesen / schreiben. Die richtige Vorgehensweise für diese Schleife ist:

%Vor%

Bei Containern, die beim Löschen eines Iterators andere Iteratoren ungültig machen könnten, gibt erase den nächsten gültigen Iterator zurück. Dann machst du es mit

%Vor%

So funktioniert es für std::vector und std::deque , aber nicht für std::map oder std::set .

    
___ answer433202 ___

Nachdem Sie %code% für einen Iterator in %code% aufgerufen haben, wird er ungültig gemacht. Dies bedeutet, dass Sie es nicht verwenden können. Der Versuch, sie zu verwenden (z. B. durch Inkrementieren), ist ungültig und kann dazu führen, dass etwas passiert (einschließlich eines Absturzes). Bei einem %code% wird durch Aufruf von %code% auf einem Iterator kein anderer Iterator (z. B.) nach diesem Aufruf ungültig (solange %code% nicht %code% ist), ist er gültig:

%Vor%

Wenn Sie diesen Ansatz verwenden, möchten Sie natürlich %code% in der for-Schleife nicht unbedingt erhöhen.

Warum sollten Sie in diesem Beispiel die for-Schleife löschen? Warum nicht einfach T2pS.clear () am Ende der Schleife aufrufen.

Auf der anderen Seite sieht es so aus, als ob Sie rechts von der Karte einen rohen Zeiger haben, aber die Karte scheint das Objekt zu besitzen, auf das gezeigt wird. In diesem Fall, warum nicht die Sache auf der rechten Seite der Karte eine Art von Smart-Pointer, wie zum Beispiel std :: tr1 :: shared_ptr?

[Ich sehe übrigens keine Template-Parameter für %code% . Haben Sie eine bestimmte Instanziierung von %code% als %code% im lokalen Namespace eingegeben?]

    
___ antwort433183 ___

Siehe :

%Vor%     
___ qstnhdr ___ Was passiert mit einem STL-Iterator nach dem Löschen in VS, UNIX / Linux? ___ answer433186 ___

Ich denke, wenn Sie die Sammlung ändern, machen Sie Ihren Iterator ungültig. Sie können sich nicht auf das Verhalten verlassen, wie Sie herausgefunden haben.

    
___ tag123stl ___ Die Standardvorlagenbibliothek (STL) ist eine C ++ - Bibliothek mit generischen Containern, Iteratoren, Algorithmen und Funktionsobjekten. Als C ++ standardisiert wurde, wurden große Teile der STL in die Standardbibliothek übernommen, und diese Teile in der Standardbibliothek werden manchmal auch zusammen als "die STL" bezeichnet. ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123linux ___ LINUX FRAGEN MÜSSEN PROGRAMMIEREN VERWANDT SEIN. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf das Programmieren mit Linux-APIs oder das Linux-spezifische Verhalten bezieht, nicht nur, weil Sie Ihren Code unter Linux ausführen. Wenn Sie Linux-Unterstützung benötigen, können Sie https://unix.stackexchange.com oder https://askubuntu.com ausprobieren ___ tag123map ___ Ein Wörterbuch (oder eine Karte) in der Informatik ist eine Datenstruktur, die Schlüssel auf Werte abbildet, so dass der entsprechende Wert eines Schlüssels effizient abgerufen werden kann. Bei Fragen zu Mapping-Funktionen über Datensammlungen verwenden Sie bitte das Tag [map-function]; und für Geographie, [Karten]. ___ tag123visualstudio2005 ___ Visual Studio 2005 ist eine Version der integrierten Entwicklungsumgebung Microsoft Visual Studio für die .NET-basierte und C ++ - Entwicklung. Verwenden Sie dieses Tag nur, wenn Sie eine bestimmte Frage zu Visual Studio haben - nicht nur ein Coding-Problem. ___ qstntxt ___

Bitte beachten Sie das folgende Szenario:

%Vor%

Mir scheint, dass in VS2005, nach dem "Erase", der Iterator gleich end () ist, daher der Absturz beim Versuch, ihn zu inkrementieren. Gibt es wirklich Unterschiede zwischen den Compilern in dem hier vorgestellten Verhalten? Wenn ja, was wird der Iterator nach dem "Löschen" gleich unter UNIX / Linux sein?

Danke ...

    
___
Johannes Schaub - litb 11.01.2009, 17:00
quelle
4

Nachdem Sie erase für einen Iterator in std::map aufgerufen haben, wird er ungültig gemacht. Dies bedeutet, dass Sie es nicht verwenden können. Der Versuch, sie zu verwenden (z. B. durch Inkrementieren), ist ungültig und kann dazu führen, dass etwas passiert (einschließlich eines Absturzes). Bei einem std::map wird durch Aufruf von erase auf einem Iterator kein anderer Iterator (z. B.) nach diesem Aufruf ungültig (solange it nicht T2pS.end() ist), ist er gültig:

%Vor%

Wenn Sie diesen Ansatz verwenden, möchten Sie natürlich it in der for-Schleife nicht unbedingt erhöhen.

Warum sollten Sie in diesem Beispiel die for-Schleife löschen? Warum nicht einfach T2pS.clear () am Ende der Schleife aufrufen.

Auf der anderen Seite sieht es so aus, als ob Sie rechts von der Karte einen rohen Zeiger haben, aber die Karte scheint das Objekt zu besitzen, auf das gezeigt wird. In diesem Fall, warum nicht die Sache auf der rechten Seite der Karte eine Art von Smart-Pointer, wie zum Beispiel std :: tr1 :: shared_ptr?

[Ich sehe übrigens keine Template-Parameter für map . Haben Sie eine bestimmte Instanziierung von std::map als map im lokalen Namespace eingegeben?]

    
Charles Bailey 11.01.2009 16:58
quelle
0
___ antwort433207 ___

Ja, wenn Sie einen Iterator löschen, erhält dieser Iterator einen sogenannten singulären Wert , was bedeutet, dass er nicht mehr zu einem Container gehört. Sie können sie nicht mehr erhöhen, dekrementieren oder auslesen / schreiben. Die richtige Vorgehensweise für diese Schleife ist:

%Vor%

Bei Containern, die beim Löschen eines Iterators andere Iteratoren ungültig machen könnten, gibt %code% den nächsten gültigen Iterator zurück. Dann machst du es mit

%Vor%

So funktioniert es für %code% und %code% , aber nicht für %code% oder %code% .

    
___ answer433202 ___

Nachdem Sie %code% für einen Iterator in %code% aufgerufen haben, wird er ungültig gemacht. Dies bedeutet, dass Sie es nicht verwenden können. Der Versuch, sie zu verwenden (z. B. durch Inkrementieren), ist ungültig und kann dazu führen, dass etwas passiert (einschließlich eines Absturzes). Bei einem %code% wird durch Aufruf von %code% auf einem Iterator kein anderer Iterator (z. B.) nach diesem Aufruf ungültig (solange %code% nicht %code% ist), ist er gültig:

%Vor%

Wenn Sie diesen Ansatz verwenden, möchten Sie natürlich %code% in der for-Schleife nicht unbedingt erhöhen.

Warum sollten Sie in diesem Beispiel die for-Schleife löschen? Warum nicht einfach T2pS.clear () am Ende der Schleife aufrufen.

Auf der anderen Seite sieht es so aus, als ob Sie rechts von der Karte einen rohen Zeiger haben, aber die Karte scheint das Objekt zu besitzen, auf das gezeigt wird. In diesem Fall, warum nicht die Sache auf der rechten Seite der Karte eine Art von Smart-Pointer, wie zum Beispiel std :: tr1 :: shared_ptr?

[Ich sehe übrigens keine Template-Parameter für %code% . Haben Sie eine bestimmte Instanziierung von %code% als %code% im lokalen Namespace eingegeben?]

    
___ antwort433183 ___

Siehe :

%Vor%     
___ qstnhdr ___ Was passiert mit einem STL-Iterator nach dem Löschen in VS, UNIX / Linux? ___ answer433186 ___

Ich denke, wenn Sie die Sammlung ändern, machen Sie Ihren Iterator ungültig. Sie können sich nicht auf das Verhalten verlassen, wie Sie herausgefunden haben.

    
___ tag123stl ___ Die Standardvorlagenbibliothek (STL) ist eine C ++ - Bibliothek mit generischen Containern, Iteratoren, Algorithmen und Funktionsobjekten. Als C ++ standardisiert wurde, wurden große Teile der STL in die Standardbibliothek übernommen, und diese Teile in der Standardbibliothek werden manchmal auch zusammen als "die STL" bezeichnet. ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123linux ___ LINUX FRAGEN MÜSSEN PROGRAMMIEREN VERWANDT SEIN. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf das Programmieren mit Linux-APIs oder das Linux-spezifische Verhalten bezieht, nicht nur, weil Sie Ihren Code unter Linux ausführen. Wenn Sie Linux-Unterstützung benötigen, können Sie https://unix.stackexchange.com oder https://askubuntu.com ausprobieren ___ tag123map ___ Ein Wörterbuch (oder eine Karte) in der Informatik ist eine Datenstruktur, die Schlüssel auf Werte abbildet, so dass der entsprechende Wert eines Schlüssels effizient abgerufen werden kann. Bei Fragen zu Mapping-Funktionen über Datensammlungen verwenden Sie bitte das Tag [map-function]; und für Geographie, [Karten]. ___ tag123visualstudio2005 ___ Visual Studio 2005 ist eine Version der integrierten Entwicklungsumgebung Microsoft Visual Studio für die .NET-basierte und C ++ - Entwicklung. Verwenden Sie dieses Tag nur, wenn Sie eine bestimmte Frage zu Visual Studio haben - nicht nur ein Coding-Problem. ___ qstntxt ___

Bitte beachten Sie das folgende Szenario:

%Vor%

Mir scheint, dass in VS2005, nach dem "Erase", der Iterator gleich end () ist, daher der Absturz beim Versuch, ihn zu inkrementieren. Gibt es wirklich Unterschiede zwischen den Compilern in dem hier vorgestellten Verhalten? Wenn ja, was wird der Iterator nach dem "Löschen" gleich unter UNIX / Linux sein?

Danke ...

    
___
orip 11.01.2009 16:44
quelle
0

Ich denke, wenn Sie die Sammlung ändern, machen Sie Ihren Iterator ungültig. Sie können sich nicht auf das Verhalten verlassen, wie Sie herausgefunden haben.

    
Sam Hoice 11.01.2009 16:46
quelle