[c++] classi associative map

Oo.Stud.ssa.oO
Come si inseriscono elementi in questo map?
map <list<string>,int> m;

Se avessi
 map<string, int>  m
per 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
vict85
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
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.

Oo.Stud.ssa.oO
Ok, ci siamo, ma adesso il problema è che se gli passo lista:
 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...

vict85
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.

apatriarca
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.

Oo.Stud.ssa.oO
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..

vict85
Forse era sufficiente chiamare il costruttore.

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?

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.