Il tipo di parametri della funzione di cancellazione di qualsiasi contenitore std (come hai elencato nella tua domanda, vale a dire se si tratta di un vettore, un elenco, una deque ...) è sempre iteratore di questo contenitore solo.
Questa funzione utilizza il primo iteratore specificato per escludere dal contenitore l'elemento a cui questo iteratore punta e anche quelli che seguono. Alcuni contenitori cancellano solo un elemento per un iteratore e alcuni altri contenitori cancellano tutti gli elementi seguiti da un iteratore (incluso l'elemento puntato da questo iteratore) fino alla fine del contenitore.Se la funzione di cancellazione riceve due iteratori, i due elementi, puntati da ciascun iteratore, vengono cancellati dal contenitore e tutti gli altri elementi vengono cancellati dal contenitore, ma il punto è che ogni iteratore passato a la funzione di cancellazione di qualsiasi contenitore std non è più valida! anche:
Ogni iteratore che stava indicando qualche elemento che è stato cancellato dal contenitore diventa valido, ma non passa l'estremità del contenitore!
Ciò significa che un iteratore che puntava su un elemento che è stato cancellato dal contenitore non può essere paragonato a container.end(). Questo iteratore non è valido e quindi non è dereferenziabile, ovvero non è possibile utilizzare né gli operatori * né ->, non è neanche incrementabile, ovvero non è possibile utilizzare l'operatore ++ e non è neanche decrementabile, ovvero non è possibile usa l'operatore -.
Non è paragonabile !!! OSSIA non è nemmeno possibile utilizzare né == né! = operatori
In realtà non è possibile utilizzare alcun operatore dichiarato e definito nell'iter iter. Non puoi fare nulla con questo iteratore, come un puntatore nullo.
Fare qualcosa con un iteratore non valido interrompe immediatamente il programma e causa persino l'arresto anomalo del programma e viene visualizzata una finestra di dialogo di asserzione. Non c'è modo di continuare il programma, non importa quali opzioni scegli, quali pulsanti fai clic. È possibile terminare il programma e il processo facendo clic sul pulsante Abort.
Non si fa altro con un iteratore non valido, a meno che non sia possibile impostarlo all'inizio del contenitore o semplicemente ignorarlo.
Ma prima di decidere cosa fare con un iteratore, in primo luogo è necessario sapere se questo iteratore non è valido o meno, se si chiama la funzione di cancellazione del contenitore che si sta utilizzando.
Ho eseguito da solo una funzione che controlla, verifica, conosce e restituisce true se un dato iteratore non è valido o meno. Puoi utilizzare la funzione memcpy per ottenere lo stato di qualsiasi oggetto, elemento, struttura, classe e così via, e ovviamente usiamo sempre la funzione memset per cancellare o svuotare un nuovo buffer, struttura, classe o qualsiasi oggetto o elemento :
bool IsNull(list<int>::iterator& i) //In your example, you have used list<int>, but if your container is not list, then you have to change this parameter to the type of the container you are using, if it is either a vector or deque, and also the type of the element inside the container if necessary.
{
byte buffer[sizeof(i)];
memset(buffer, 0, sizeof(i));
memcpy(buffer, &i, sizeof(i));
return *buffer == 0; //I found that the size of any iterator is 12 bytes long. I also found that if the first byte of the iterator that I copy to the buffer is zero, then the iterator is invalid. Otherwise it is valid. I like to call invalid iterators also as "null iterators".
}
ho già testato questa funzione prima ho postato lì e ho trovato che questa funzione sta lavorando per me.
Spero davvero di aver esaudito pienamente la tua domanda e di averti aiutato moltissimo!
In C++, quando si modifica l'iteratore e non si utilizza il valore, si dovrebbe sempre preferire '++ itd' a' itd ++ '. –
Dopo aver visto il nuovo esempio di codice, nota che i metodi di cancellazione STL restituiscono l'iteratore successivo, che è un iteratore valido (sebbene possa essere l'iteratore finale). Pertanto, per mantenerlo valido, è possibile eseguire questa operazione: if (qualcosa) { itd = l.erase (itd); } –
Mmm ... Vedo ... – huff