Wie überprüft man, ob der Iterator initialisiert ist?
Wenn ich einen default-Konstruktor ein iterator, wie Sie überprüfen, wenn es zugewiesen wurde später auf?
Für Hinweise, was ich tun konnte :
int *p = NULL;
///some code
if ( NULL == p ) {
//do stuff
}
Wie mache ich das oben für Iteratoren?
Ist es überhaupt möglich?
#include <iostream>
#include <list>
int main ()
{
std::list<int>::iterator it;
if ( NULL == it ) //this fails
{
std::cout<<"do stuff" << std::endl;
}
}
InformationsquelleAutor der Frage BЈовић | 2011-08-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich es geschafft, zu finden im aktuellen standard (c++03 ). 24.1 p 5 sagt :
(Hervorhebung von mir)
Die Antwort ist also : Nein, es ist nicht möglich.
InformationsquelleAutor der Antwort BЈовић
Meisten Iteratoren haben keine globalen special-Werte in der gleichen Weise, dass alle Zeiger können NULL sein. Typischerweise, obwohl, arbeiten Sie mit bestimmten Behälter, und wenn Sie halten ein iterator pro container, dann können Sie
end()
the sentinel-Wert:Ich bin mir nicht sicher, ob Einfügung/Löschung erlischt die
end()
iterator, obwohl, so dass, wenn Sie planen, ändern Sie Ihre container, vielleicht speichern Sie eine Kopie der ursprünglichen Zweck zu:Obwohl wieder ich bin nicht wirklich sicher, ob es gut definiert ist, zu vergleichen zwei ungültige Iteratoren (in dem Fall, dass die beiden zu tun bekommen, für ungültig erklärt).
InformationsquelleAutor der Antwort Kerrek SB
In C++, nicht initialisierte lokale Variablen haben können alle Wert ich.e es enthält einfach Müll. Das bedeutet, Sie nicht überprüfen Sie es gegen wohldefinierte Wert, um zu bestimmen, wenn die variable nicht initialisiert ist, oder nicht.
Nicht nur, dass, wenn die variable nicht initialisiert ist und schreiben Sie diese in:
dann ruft es zu undefiniertem Verhalten.
InformationsquelleAutor der Antwort Nawaz
Diese Frage wurde bereits behandelt, in Stackoverflow. Die Quintessenz ist, dass der Standard-Konstruktor initialisiert einen iterator, um eine singular valueund die nur addmissible Vorgang ist, ordnen Sie es mit einem anderen iterator-Wert. Insbesondere ist es nicht möglich, die Abfrage des Wertes solcher nicht initialisiertes iterator. Deshalb ist es ein guter Programmierstil, initialisiert den iterator auf einen bestimmten Wert einer bestimmten container, die dann getestet werden können.
InformationsquelleAutor der Antwort Jiri
Da es keinen Standardwert für Iteratoren (wie es ist NULL für Zeiger), in der situation wo ich brauche einen gemeinsamen default-Wert für eine
Object::iterator
(vor der eigentlichen Objekt erstellt wurde) erstelle ich eine dummy-variable, und verwenden Sie seine::end()
als Standard.Update : Das funktioniert nur bei "Release", denn in der DEBUG (oder mit
_HAS_ITERATOR_DEBUGGING=1
) Vergleichsoperatoren überprüfen Sie, ob beide Iteratoren auf das selbe Objekt zeigen/container.Beispielsweise für
vector<int>
ich tun würde :InformationsquelleAutor der Antwort code7amza
Können Sie nicht. ll, die Sie tun können, ist, vergleichen, Liste gegen Ende
InformationsquelleAutor der Antwort cprogrammer
Vielleicht sollten Sie sich immer die Zuweisung eines vordefinierten Wert, wie NULL, nach dem erstellen der iterator. Später können Sie leicht überprüfen, gegen NULL.
Dadurch wird Ihr code mehr tragbar, da Sie nicht davon abhängen, welche Startwerte die nicht initialisierten Variablen werden am Anfang.
InformationsquelleAutor der Antwort vsz
Aber ich vermute,... kann es vorkommen, dass ein Gültiger iterator übergeben konnte Vergleich.
Besser, diese Situationen zu vermeiden. Wenn es unmöglich ist, lagern Sie den iterator durch einen Zeiger.
InformationsquelleAutor der Antwort kan
Der beste Weg, dies zu tun ich denken kann, ist so etwas wie
aber es ist nicht gerade eine sichere Lösung (weil Sie sich auf die non-const-global Container in
nullcontainers
).InformationsquelleAutor der Antwort leftaroundabout
Soweit ich weiß muss man immer initialisieren Sie Ihre Iteratoren und der einfachste Weg ist, um Sie gleich 'container'.Ende()
In bestimmten Fällen sieht es aus wie Arbeit, wir hatten einige Probleme mit code, der arbeitete mit VC6 und aufgehört zu arbeiten mit VC2010. Schauen Sie sich dieses Beispiel kompiliert mit g++, wo es funktioniert für den Vektor, aber nicht für die Karte:
InformationsquelleAutor der Antwort Pedro Ferreira
Ich habe folgende Lösung:
Dann ist eine überprüfung möglich:
InformationsquelleAutor der Antwort Thomas Horn