2009-07-27 14 views
11

Lo standard C++ dice che dovrei essere in grado di confrontare due iteratori STL costruiti in modo predefinito per l'uguaglianza? Gli iteratori costruiti in modo predefinito sono uguali?Confronto tra iteratori costruiti in modo predefinito con operatore ==

voglio quanto segue, utilizzando std :: list per esempio:

void foo(const std::list<int>::iterator iter) { 
    if (iter == std::list<int>::iterator()) { 
     // Something 
    } 
} 

std::list<int>::iterator i; 
foo(i); 

Quello che voglio qui è qualcosa come un valore NULL per iteratori, ma non sono sicuro se è legale. Nell'implementazione STL inclusa in Visual Studio 2008, includono asserzioni nell'operatore di std :: list ==() che preclude questo utilizzo. (Controllano che ciascun iteratore sia "posseduto" dallo stesso contenitore e gli iteratori costruiti in modo predefinito non contengano alcun contenitore.) Ciò potrebbe suggerire che non è legale, o forse che sono troppo zelanti.

+0

'boost :: opzionale ' 'mi viene in mente. – MSalters

risposta

15

OK, prenderò una pugnalata. Il Visual C++ Sezione 24,1/5:

Iteratori può anche avere singolari valori che non sono associati con qualsiasi contenitore. [Esempio: dopo la dichiarazione di un puntatore non inizializzato x (come con int * x;), x deve assumere sempre un valore singolare di un puntatore. ] I risultati della maggior parte delle espressioni non sono definiti per i singoli valori ; l'unica eccezione è l'assegnazione di di un valore non singolare a un iteratore che contiene un valore singolare .

Quindi, no, non possono essere confrontati.

+0

Bello, hai capito :) – AraK

+0

Che dire di 'std :: istream_iterator. Questo è esattamente il modo in cui confronti il ​​test per la fine. –

1

Credo che si dovrebbe passare un intervallo alla funzione.

void fun(std::list<int>::iterator beg, std::list<int>::iterator end) 
{ 
    while(beg != end) 
    { 
     // do what you want here. 
     beg++; 
    } 
} 
+1

Forse vero, ma non risponde alla domanda. –

+0

Sì, solo i miei 2 centesimi :) – AraK

+1

Capisco cosa stai dicendo, ma la semantica richiede davvero un singolo elemento - molto simile a std :: list :: erase(). Potrei abusare del concetto di un iteratore; questo è quello che mi interessa scoprire. – Adrian

1

Le specifiche indicano che la post-condizione del costruttore predefinito è che l'iteratore è singular. Il confronto per l'uguaglianza non è definito, quindi potrebbe essere diverso in alcune implementazioni.

6

Questo sta per cambiare in C++ 14. [Forward.iterators] 24.2.5p2 di N3936 dice

Tuttavia, iteratori valore inizializzato può essere confrontato e si confronta uguale agli altri iteratori valore inizializzato dello stesso tipo.

+0

L'ho colpito proprio adesso quando implementavo qualcosa al lavoro :(Desideravo di avere C++ 2014 ma avevo solo studio visivo 2012: D –

+0

Questa non è ancora una buona idea anche in C++ 14 perché gli iteratori non singolari possono essere confrontato con un iteratore inizializzato in base al valore. –

Problemi correlati