mercoledì, gennaio 03, 2007

Inserire oggetti in una mappa

Per inserire un oggetto in una std::map ci sono due metodi possibili.
Uno dei due, che abbiamo gia' visto, si basa sull'implementazione dell'operator[]() per la classe std::map :


std::map<std::string,istogramma> mappaHistos ;
istogramma primoHisto ; // chiamata al default ctor
mappaHistos["primo istogramma"] = primoHisto ;


Un altro metodo per inserire oggetti nella mappa sfrutta il metodo insert della classe std::map:


std::map<std::string,istogramma> mappaHistos ;
istogramma primoHisto ; // chiamata al default ctor
mappaHisto.insert (std::map<std::string,istogramma>::value_type ("primo istogramma",primoHisto)) ;


Si tratta di un modo per inserire nella mappa direttamente un suo elemento, cioe' una coppia (chiave,oggetto) gia' composta.
Innanzitutto, viene creata la coppia, utilizzando value_type, che e' un typedef presente in tutti gli standard container ed e' il tipo contenuto: in questo caso, una coppia (pair).
Per creare la coppia, vengono chiamati i costruttori dei suoi due elementi, vale a dire della stringa e dell'istogramma. Per la stringa a partire da un parametro iniziale, per l'istogramma a partire da primoHisto.
Quando la coppia e' stata creata, viene passata al metodo insert della std::map che provvede ad aggiungere alla mappa un elemento sulla base dell'oggetto temporaneo passatogli come argomento.
Quest'ultimo oggetto temporaneo verra' poi distrutto.

In definitiva, per scrivere tutto un una riga in entrambi i casi:


std::map<std::string,istogramma> mappaHistos ;
mappaHisto.insert (std::map<std::string,istogramma>::value_type ("primo istogramma",istogramma ())) ;
mappaHistos["secondo istogramma"] = primoHisto ;


Ovviamente, al posto del costruttore di default istogramma () ogni costruttore dell'istogramma (NON il copy ctor) puo' essere utilizzato.
Perche' la mappa venga riempita correttamente, e' necessario che il copy constructor e l'operatore di assegnazione operator= () siano implementati.

Nessun commento: