2012-12-20 12 views
6

Costruisco un std::list di elementi (strutture componenti del grafico) che vengono unite periodicamente. L'idea è che se scopro un nodo che collega due componenti diventano un unico componente e il mio elenco enumera i miei componenti. Ogni componente ha un handle (in questo caso uno std::list<component>::iterator) al suo componente "parent", che viene impostato una volta unito. In questo modo, per determinare il componente che appartiene a un particolare nodo, salgo questa catena.Rimuovi elemento in std :: list lasciandolo allocato

Alla fine quello che sto cercando è l'operazione su std::list che mi permette di prendere un iteratore di elemento N, e rimuovo dalla lista, ma senza deallocando esso: la struttura del resto della lista viene modificato esattamente nello stesso modo in cui viene rimosso normalmente.

Preferibilmente qualcosa di meno brutto di ridistribuire l'elemento, copiarlo dall'elenco e chiamare il reale remove o erase.

Forse riesco a farlo con splice. Avrei bisogno di unire gli elementi da rimuovere in una "spazzatura" list, no?

+5

'splice'-ing in una _junk list_ suona bene ... –

+0

E un tale approccio ha l'improbabile possibilità che l'uso di allocatori incompatibili costringa a copiare. Ancora ... ci sono alcuni suggerimenti extra che vengono mescolati. Beh ... non * fa male * avere un modo per scorrere i miei nodi non completamente orfani. –

+0

Perché utilizzare l'elenco anziché l'elenco non è adatto a te? –

risposta

1

È possibile farlo con un giunto. Ad esempio, spostare *it alla lista spazzatura:

junk.splice(junk.begin(),comp_list,it); 

È inoltre possibile aggiungere move-ctor a component. Poi, prima di cancellare dalla lista delle mosse contenuti a TMP var, qualcosa di simile:

component tmp(*it); 
li.erase(it); 

anche il suggerimento di Fomin Arseniy da usare lista di puntatori ai componenti (o std::shared_ptr) è troppo buono.

+0

un semplice 'elenco ' è probabile che comporti più contabilità manuale del necessario, ma 'lista >' è probabilmente un approccio solido pure. Volevo mantenere le cose semplici: con l'approccio lista spazzatura posso evitare di scrivere la parola chiave 'new'. –