2010-12-11 21 views
11

In un algoritmo che sto attualmente implementando, ho bisogno di manipolare un elenco std :: struct T. T contiene un riferimento a un'altra istanza di T, ma questo riferimento può anche essere "non assegnato". Inizialmente, volevo usare un puntatore per mantenere questo riferimento, ma usare un iteratore invece rende più facile la rimozione dalla lista.Iteratore equivalente al puntatore nullo?

La mia domanda è: come rappresentare l'equivalente del puntatore nullo con il mio iteratore?

Ho letto la soluzione generale è utilizzare myList.end(), ma nel mio caso, ho bisogno di verificare se l'iteratore è "null" o no, e posso aggiungere o rimuovere elementi alla lista tra il momento in cui Conservo l'iteratore e nel momento in cui lo rimuovo dall'elenco ... Devo far puntare l'iteratore su una lista conosciuta contenente l'elemento "null"? O c'è una soluzione più elegante?

risposta

15

Secondo this (enfasi da me):

Rispetto agli altri sequenza di basi contenitori (vector e deque), elenca sono il contenitore più efficiente facendo inserzioni in una qualche posizione diversa la all'inizio o alla fine della sequenza e, a differenza di questi, di tutti gli gli iteratori ottenuti in precedenza e i riferimenti rimangono validi dopo l'inserimento e si riferiscono allo stesso elementi a cui si riferivano prima.

Lo stesso vale per la cancellazione (con l'ovvia eccezione di iteratori che si riferiscono ad un elemento cancellato diventando invalidato). Quindi sì, ottenere end() punterà sempre allo stesso elemento "non valido" e dovrebbe essere sicuro da usare.

+0

Ok, fantastico! Avevo la sensazione che end() sarebbe stata una "eccezione alla regola", e che rappresenterebbe il prossimo elemento che avresti push_back nella tua lista ... – Mikarnage

+0

Nah, la STL è più intelligente di quella. :) – suszterpatt

+0

Sono curioso: qualcuno sa se anche quello è nello "standard"? – sje397

Problemi correlati