[c++] classi associative map
Come si inseriscono elementi in questo map?
Se avessi
Ma come faccio a specificare la chiave se al posto di string ho list?
E poi che senso ha associare ad un valore una lista di chiavi?
map <list<string>,int> m;
Se avessi
map<string, int> mper inserire 1 con chiave "chiave" dovrei fare
m.insert(pair<string,int> (string("chiave"),1);
Ma come faccio a specificare la chiave se al posto di string ho list
E poi che senso ha associare ad un valore una lista di chiavi?
Risposte
Sinceramente non so a cosa serva e non ho lavorato molto con queste strutture della standard library.
Comunque immagino che tu abbia già degli elementi di tipo list e che quindi tu possa fare qualcosa del tipo
Nota che anche il tuo codice poteva essere espresso più semplicemente come
In ogni caso, in C++11 puoi costruire le liste in questo modo
Comunque immagino che tu abbia già degli elementi di tipo list
list<string> StringList; // operazioni varie che danno un valore alla lista. m[StringList] = 1;perché a quanto sembra l'operatore [] fa l'inserimento in automatico se non trova la chiave tra quelle già inserite. Cosa che non succede con .at().
Nota che anche il tuo codice poteva essere espresso più semplicemente come
m[string("chiave")]=1;
In ogni caso, in C++11 puoi costruire le liste in questo modo
list<string> StringList{"S1", "S2", "S3", "S4", "S5"};o anche mettendo un uguale.
Ok, ci siamo, ma adesso il problema è che se gli passo lista:
Se stampo, mi accorgo che nel map ho inserito solo uno degli elementi
il problema è che nell'inserimento prende sempre la stessa chiave della list...
e quindi essendo una set e non un multiset, i doppioni non vengono inseriti
Forse un modo per ovviare al problema è cambiare lista ad ogni inserimento, ma non mi sembra un modo efficiente di programmare...
list<string> lista; lista.push_back("chiave1"); m[lista]=345;
Se stampo, mi accorgo che nel map ho inserito solo uno degli elementi
for(iter=m.begin();iter!=m.end();iter++){ cout<<iter->second<<"-"; }
il problema è che nell'inserimento prende sempre la stessa chiave della list...
e quindi essendo una set e non un multiset, i doppioni non vengono inseriti
Forse un modo per ovviare al problema è cambiare lista ad ogni inserimento, ma non mi sembra un modo efficiente di programmare...
Quello per certi versi è un problema secondario perché se inserisci tutto l'inserimento in un ciclo e definisci la lista nel ciclo allora ogni nuova iterazione di crea una nuova lista. Comunque a cosa ti serve questa mappa di liste? Probabilmente ci sono strutture dati più consone per fare quello di cui hai bisogno.
Non riesco a pensare ad alcuna ragione per fare qualcosa come quello che chiedi. Che cosa stai cercando di fare? Sembra uno di quei casi in cui la soluzione migliore è quella di pensare ad una soluzione diversa al problema originario.
Non è una mia idea, era l'esercizio di un esame che mi sono ritrovata a fare stamattina!!
Comunque creando una nuova lista prima di ogni inserimento più o meno funziona..

Comunque creando una nuova lista prima di ogni inserimento più o meno funziona..
Forse era sufficiente chiamare il costruttore.
Nel senso
Ma per curiosità, qual'era il testo del problema generale?
Nel senso
list L; ... m[list(L)] = 1;immagino si comporti come se ne crei una nuova.
Ma per curiosità, qual'era il testo del problema generale?