2010-12-06 15 views
2

Da ich weiß, dass ein Iterator im Programm durch eine vorherige Operation ungültig gemacht werden könnte, möchte ich es explizit ungültig machen. Wie z. B. NULL einem Zeiger zuweisen, um es ungültig zu machen, ich möchte nur das gleiche auf Iterator tun. container.end() könnte hier nicht die genaue Idee sein. Ich habe versucht, meinem Iterator NULL zuzuweisen, aber es ist fehlgeschlagen. Wie kann ich das gleiche Verhalten von NULL-Zeiger auf Iterator bekommen?Wie kann ein Iterator ungültig gemacht werden?

+0

Erstens, ich denke, es ist keine gute Idee zu einem solchen Verhalten. Zweitens können Sie den Zeiger auf den Iterator speichern. – W55tKQbuRu28Q4xv

+1

Wenn du wirklich willst, kann jemand erklären, wie man explizit Undefined Behavior bekommt ;-) – kriss

+0

Warum möchtest du das? Es gibt nichts, was Sie danach mit dem Iterator machen können, was Sie vorher nicht tun konnten. – MSalters

Antwort

1

Sollte das nicht immer funktionieren? (Iteratoren sind immer zuweisbar und standardmäßig konstruierbar)

template <typename Iter> 
void foo(Iter it){ 
    it = Iter(); // invalidate 
} 
+0

Das ist sehr cool. Ich kann den Iteratortyp direkt erhalten, also ist die Funktion nicht notwendig. Übrigens, ich denke, wir müssen es als Referenz weitergeben, ist das richtig? – Thomson

+0

um es zu ändern, sicher. Dies war nur ein Beispiel. Der einzige Grund, warum ich es zu einer Funktion gemacht habe, war, dass es der einfachste Weg war zu sagen "Angenommen, der Iterator-Typ ist' Iter' und das Iterator-Objekt heißt 'it' ..." :) – jalf

2

Warum eröffnen Sie bitte wollen container.end() verwenden ... es funktioniert für die meisten Container ...

für std :: string Möglicherweise möchten Sie überprüfen, ob die Position yourstring.npos ist?;

4

durch eine vorherige Operation für ungültig erklärt werden könnte, möchte ich es ausdrücklich

ungültig zu machen ... Wenn Sie wissen, dass es nicht gültig sein kann, dann alles, was Sie es Anschlag zu tun haben, mit ihm . Das Ungültigmachen des Iterators führt explizit nichts aus, da es sich um einen Programmierfehler handelt.

+2

Versuchen Sie, den Umfang Ihres Iterators durch Verwendung zusätzlicher Blöcke zu begrenzen. Außerhalb des Blocks ist der Iterator nicht mehr vorhanden. Das ist besser als ungültig. –

1

Sie können im Allgemeinen nicht. Es gibt einige Iteratoren, die überhaupt nicht ungültig gemacht werden können. Zum Beispiel kann ein Zufallszahlengenerator als Ausgabe-Iterator modelliert werden, wobei operator* die aktuelle Zahl zurückgibt und operator++ eine neue erzeugt.

Verwandte Themen