2009-05-28 5 views
5

Continuerò a breve.Rimozione elemento mappa per valore

Sto cercando di mantenere una mappa tra stringhe e puntatori di oggetti e, come tale, utilizzo std :: map. Ho un manager che è una classe globale che tiene traccia della mappa, e ogni volta che viene chiamato un distruttore di un oggetto, dice al manager che è stato cancellato.

L'unico modo che posso pensare è quello di cercare attraverso la mappa per l'oggetto. Esiste una soluzione STL efficiente a questo problema? Esiste una mappa che sia efficiente alla ricerca per chiave?

risposta

8

No, non esiste un modo efficiente per farlo con std :: map oltre che iterando confrontando i valori.

Tuttavia la maggior parte delle volte la chiave per un valore è calcolabile dal valore stesso. Ad esempio, utilizzando la proprietà Name di un oggetto Person come chiave. È possibile che il gestore memorizzi un elenco di coppie chiave/valore in contrasto con il valore stesso. Questo risolverebbe il tuo problema senza dover riscrivere un nuovo algoritmo.

Oppure in alternativa è possibile mantenere una mappa inversa sulla classe manager. In sostanza valore alla chiave. In questo modo puoi usarlo per calcolare la chiave da rimuovere in seguito.

+0

Grazie! Non ho nemmeno pensato di avere l'oggetto per memorizzare la chiave stessa. Sicuramente una soluzione migliore di una seconda mappa. –

+0

+1, rimuoverò la mia risposta poiché suona uguale alla tua. –

1

Dai uno sguardo alla libreria Boost Multi-Index Containers.

+0

Si noti che è necessario che sia le chiavi che i valori siano univoci per poter utilizzare una mappa bidirezionale. std :: map richiede solo chiavi univoche. –

4

Guardando SGI's documentation for the STL,

mappa ha la proprietà importante che l'inserimento di un nuovo elemento in una mappa non invalida iteratori che punto agli elementi già esistenti. La cancellazione di un elemento da una mappa, inoltre, non invalida alcun iteratore, ad eccezione del corso , per gli iteratori che effettivamente indicano l'elemento che si sta cancellando. cancellato.

Quindi è possibile memorizzare un iteratore nella mappa all'interno dell'oggetto e utilizzarlo come chiave di ricerca a tempo costante quando è necessario eliminare la relativa voce.