Stavo passando per "Usare la mappa come array associativi" di Josuttis (da The C++ Standard Library - A Tutorial and Reference, 2nd Edition) e ho trovato Using a std::map as an associative array su Stack Overflow. Ora ho altre domande sui costruttori chiamati durante l'inserimento in una mappa.Hai bisogno di aiuto per capire come usare la mappa C++ come array associativo
Ecco il mio programma di esempio (se non utilizzano le pratiche migliori di codifica, si prega di scusarmi per questo):
class C
{
public:
string s;
C() { cout << "default " << endl;}
C(const string& p) : s(p)
{ cout << "one param" << endl;}
C(const C& obj)
{
if (this != &obj)
{
s = obj.s;
}
cout << "copy constr" << endl;
}
C& operator = (const C& obj)
{
if (this != &obj)
{
s = obj.s;
}
cout << "copy initializer" << endl;
return *this;
}
};
int main()
{
map<int,C> map1;
C obj("test");
cout << "Inserting using index" << endl;
map1[1] = obj;
cout << "Inserting using insert/pair" << endl;
map1.insert(make_pair(2,obj));
}
L'output di questo programma è:
one param
Inserting using index
default
copy constr
copy constr
copy initializer
Inserting using insert/pair
copy constr
copy constr
copy constr
copy constr
stavo partendo dal presupposto che l'inizializzazione mappa per indice dovrebbe chiamare il costruttore predefinito e seguito dall'operatore di assegnazione.
Ma l'esecuzione di map1[1] = obj
crea l'output successivo;
Inserting using index
default
copy constr
copy constr
copy initializer
Qualcuno può aiutarmi a capire meglio l'inizializzazione?
Non avete bisogno di testare per la costruzione di copia a sé. –
In realtà, ora capisco che è meglio avere puntatori rispetto agli oggetti nei contenitori STL. – mithuna
@mithuna: Attenzione: la memorizzazione dei puntatori anziché degli oggetti comporta problemi di gestione a vita, quindi direi che è meglio memorizzare gli oggetti. * Se * questo causa problemi di prestazioni, dovresti vedere se la copia può essere ottimizzata. Quindi, * se * non lo è, potresti prendere in considerazione la memorizzazione di puntatori invece di oggetti. In tal caso, potresti essere interessato alla libreria Boost.PointerContainer (http://www.boost.org/doc/libs/1_40_0/libs/ptr_container/doc/ptr_container.html). ptr_map (http://www.boost.org/doc/libs/1_40_0/libs/ptr_container/doc/ptr_map.html), nel caso presente. –