2009-07-01 11 views
6

Ho ragione nell'assumere che l'aggiunta/rimozione di elementi a una std :: map non influenzi gli altri elementi (cioè li facciano riposizionare in memoria) e in modo che quanto segue è sicuro:C++ Memorizzare i riferimenti ai valori in std :: map

ho guardato vari siti con informazioni sul contenitore, ma solo scoperto sui casi in cui vengono invalidate iteratori, che so già ...

std::map<std::string,std::string> map; 
PopulateMap(map); 
std::string &a= map["x"]; 
AddMoreData(map); 
RemoveRandomKeysExceptX(map); 
map["x"] = "foo"; 
std::cout << a << " " << map["x"] << std::endl;//prints "foo foo" 
a = "bar"; 
std::cout << a << " " << map["x"] << std::endl;//prints "bar bar" 

ho provato un po 'di codice simile a VC9 , che sembra funzionare comunque, ciò non significa che non sono stato fortunato o che non varia da un compilatore all'altro.

+0

Non sono sicuro del motivo per cui hai cancellato la risposta, è stato corretto per quanto ho potuto vedere. – CiscoIPPhone

+0

La risposta di naveen riguardava gli iteratori, che questa domanda non è –

+0

Ho anche cancellato la mia risposta, perché in seconda lettura non sono completamente chiaro quale sia la vera domanda. –

risposta

8

Lo Standard è chiara su questo in 23.1.2/8 su contenitori associativi

I membri insert non pregiudica la validità di iteratori e riferimenti al contenitore, ed i membri di cancellazione invaliderà solo iteratori e riferimenti agli elementi cancellati.

+0

+1. Ho bisogno di tenere una copia dello standard a portata di mano. La mia risposta avrebbe potuto essere più concisa e definitiva. – CiscoIPPhone

+0

Sì, è sempre una buona idea mantenere un'istanza di okular/acroread aperta in modo da poter cercare rapidamente roba =) In questo caso, ho ricordato la discussione che ho avuto qui: http://stackoverflow.com/questions/516007/stdmap- pointer-to-map-key-value-is-this-possible =) –

+0

Ti incoraggio a revocare la risposta @ greg-rogers lì. Perché è quello giusto, ovviamente, mentre la risposta accettata dice che non puoi essere sicuro di questo. Ma lo standard è abbastanza chiaro che i puntatori continuano a essere validi. –

3

La mappa ha la proprietà importante che l'inserimento di un nuovo elemento in una mappa non invalida gli iteratori che puntano a elementi esistenti. quote prese da sgi docs.

Se gli iteratori sono sicuri di non cambiare, anche i valori a cui puntano non possono essere modificati.

naveen aveva in precedenza una risposta simile a questa. A meno che non ci sia un errore nella mia logica, quello che stai facendo è sicuro.

Modifica 2: Vedere il punto 3 in sgi docs per vedere come ottenere un valore dall'operatore [] equivale a ottenere il valore da un iteratore.

+1

Come ho sottolineato a naveen (non nadeen) , la domanda non riguarda gli iteratori. –

+0

Lo capisco, ma l'operatore [] usa gli iteratori. – CiscoIPPhone

+0

Si noti che i documenti SGI hanno discrepanze piccole nella libreria standard a volte, quando si tratta di dettagli. –

0

Sì, puoi contare su questo.

// retrieve reference to string stored at "x" 
// note that since [] returns a reference, it must insert an element at "x" if 
// it doesn't exists (in this case an empty string) 
std::string &a= map["x"]; 

// retrieve reference for "x" again and set value to "foo" 
map["x"] = "foo"; 

// use already stored reference 
a = "bar"; 
Problemi correlati