c++ vector - Come verificare se l'iteratore STL punti a qualcosa?




example list (5)

Non puoi Il solito idioma è usare l'iteratore finale del contenitore come un indicatore "non trovato". Questo è ciò che std::find restituisce.

std::vector<int>::iterator i = std::find(v.begin(), v.end(), 13);
if (i != v.end())
{
     // ...
}

L'unica cosa che puoi fare con un iteratore non assegnato è assegnargli un valore.

Possibile duplicato:
C ++ Il modo migliore per verificare se un iteratore è valido

Voglio fare qualcosa del genere:

std::vector<int>::iterator it;
// /cut/ search for something in vector and point iterator at it. 
if(!it) //check whether found
    do_something(); 

Ma non c'è operatore! per gli iteratori. Come posso verificare se l'iteratore punta a qualcosa?


Credo che questo dovrebbe generalmente darti una buona prova:

if (iterator._Mycont == &MyContainer)
{
Probably a valid iterator!
}

Potresti fare dei test per assicurarti che l'iteratore non sia uguale alla fine ...

iterator != MyContainer.end()

e:

iterator >= MyContainer.begin()

Sebbene gli iteratori siano considerati come una forma generale di indicatori, non sono esattamente i puntatori. Lo standard definisce iteratore Past-the-end per indicare l'errore di ricerca nei contenitori. Quindi, non è consigliabile controllare gli iteratori per NULL

Past-the-end valori Past-the-end sono non singolari e nondereferenceable.

if(it != aVector.end())  //past-the-end iterator
    do_something();

Se si desidera utilizzare iteratore in un ciclo, il modo più sicuro per utilizzarlo è in questo modo:

for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
 do_smth();
}

Cercando di rendere questa risposta il più semplice e versatile possibile:

if( itr!=Mine.end() && itr== --Mine.end())

Se l'iteratore non è bidirezionale,

if( itr!=Min.end() && ++decltype(itr)(itr)==Mine.end())

Il secondo crea una copia temporale di itr e lo incrementa per testare l'iteratore finale.

In entrambi i casi, il primo test evita i contenitori vuoti per attivare una situazione non definita.





c++ stl iterator