2010-08-03 6 views
48

Für jeden STL-Container, den ich verwende, wenn ich einen Iterator (dieses speziellen Containertyps) mit dem Standardkonstruktor des Iterators deklariere, worauf wird der Iterator initialisiert?Was ist der Standardwert eines Iterators?

Zum Beispiel habe ich:

std::list<void*> address_list; 
std::list<void*>::iterator iter; 

Was wird iter zu initialisiert werden?

+0

'std :: list :: iterator iter;' ist ein __definition__. Während alle Definitionen Deklarationen sind, wäre eine Deklaration, die keine Definition ist: 'extern std :: list :: iterator iter;'. – sbi

+0

Der Konstruktor gehört insbesondere zur _definition_, keiner anderen Deklaration. Dies bedeutet, dass Sie Werte nur in der (einzelnen) Definition an den Konstruktor übergeben können. Wenn der ctor eine Vorlage ist (wie hier), wird er instanziiert, wo die Definition ist. – MSalters

Antwort

43

a „NULL Iterator“ für Behälter Vereinbarungs, die kein Ergebnis, um anzuzeigen, verwendet wird, vergleicht gleich zu dem Ergebnis container.end().

std::vector<X>::iterator iter = std::find(my_vec.begin(), my_vec.end(), x); 
if (iter == my_vec.end()) { 
    //no result found; iter points to "nothing" 
} 

Da jedoch ein Standard-Container aufgebaut Iterator nicht mit einem bestimmten Behälter verbunden ist, gibt es keinen guten Wert, der es nehmen könnte. Daher ist es nur eine nicht initialisierte Variable und die einzige zulässige Operation, die damit zu tun hat, ist, einen gültigen Iterator zuzuweisen.

std::vector<X>::iterator iter; //no particular value 
iter = some_vector.begin(); //iter is now usable 

Für andere Arten von Iteratoren könnte dies nicht wahr sein. ZB im Fall von istream_iterator, stellt ein default-konstruierter Iterator eine istream_iterator dar, die den EOF eines Eingabestroms erreicht hat.

+2

Es gibt einen Vorschlag für einen Wert initialisiert Iterator zu existieren. Siehe http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3644.pdf – Ghita

+3

Unter diesem Vorschlag würde das Schreiben von auto ni = Vektor :: iterator() einen Nullvektor Iterator erzeugen das würde mit jedem anderen Iterator desselben Typs gleich sein – Ghita

10

Der Iterator wird nicht initialisiert, genauso wie int x; eine Ganzzahl deklariert, die nicht initialisiert wird. Es hat keinen richtig definierten Wert.

+2

Gibt es eine Möglichkeit, Iter auf NULL zu initialisieren? –

+3

@The Void: Ihre Frage ergibt keinen Sinn. 'NULL' ist ein Wert, den _pointers_ haben kann, Bot-Iteratoren. Während alle Zeiger Iteratoren sind, sind nicht alle Iteratoren Zeiger. – sbi

+0

Also, während es so etwas wie einen NULL-Zeiger gibt, gibt es so etwas wie einen "NULL-Iterator" nicht? –

20

Der Standard-Konstruktor initialisiert einen Iterator auf einen Singulärwert:

Iteratoren auch singuläre Werte haben können, die nicht mit einem beliebigen Reihenfolge verknüpft sind. [Beispiel: Nach der Deklaration eines nicht initialisierten Zeigers x (wie bei int * x;) muss x immer als singulärer Wert eines Zeigers angenommen werden. -End Beispiel] Ergebnisse der meisten Ausdrücke sind nicht definiert für singuläre Werte [24.2.1 §5]

+11

Meine standarde Abneigung wieder auffällig. '' Was bedeutet das in verständlicher Sprache? – sbi

+1

@sbi: Nun, der Absatz geht weiter und weiter, ich habe beschlossen, es zu schneiden. Grundsätzlich darf man nichts Nützliches mit einem singulären Wert machen, zum Beispiel den dereferenzieren oder vergleichen. – fredoverflow

+6

@sbi: Ersetzen Sie einfach alle Instanzen von "singular" durch "seltsam". Du darfst nichts damit anfangen, weil es in einem komischen Zustand ist. – jalf