Newsgroup: it.comp.lang.c++
Titolo: map di map...

ciao a tutti, ho la necessita' di utilizzare una "mappa di mappe", con
la seguente signature:
std::map<miaclasse, std::map<std::string,int> > mappa
schema grafico x semplificare:
-------------------------------------------
| chiave:miaclasse   |  valore:mappa      |
-------------------------------------------
| miaclasse1         |  -------------------
|                    |  |  "A" |      3   |
|                    |  |  "B" |      4   |
|                    |  |  "C" |      3   |
|                    |  -------------------
------------------------------------------
| miaclasse2         |
|                    |
|
adesso devo riempirla di valori, dentro ad un ciclo ho, per ogni iterazione
miaclasse_i, stringa_i, int_i
secondo me doveva funzionare la seguente operazione:
mappa[miaclasse(...)][stringa_i]=int_i;
perche' invece non funziona e sovrascrive dei valori?
infatti so per certo che dovrebbe contenere 1600 valori, alla fine
ne contiene solo 180... dove sbaglio? come rimedio?
PS1: ovviamente le chiavi di mappa sono tutte con valori diversi!
PS: se e' una stupidata scusate, sono fuso!
-- 
Ciao by Allanon
Q: Why do programmers always mix up Christmas and Halloween?
A: Because 25 Dec = 31 Oct

ciao a tutti, ho la necessita' di utilizzare una "mappa di mappe", con
la seguente signature:
std::map<miaclasse, std::map<std::string,int> > mappa
schema grafico x semplificare:
-------------------------------------------
| chiave:miaclasse   |  valore:mappa      |
-------------------------------------------
| miaclasse1         |  -------------------
|                    |  |  "A" |      3   |
|                    |  |  "B" |      4   |
|                    |  |  "C" |      3   |
|                    |  -------------------
------------------------------------------
| miaclasse2         |
|                    |
|
adesso devo riempirla di valori, dentro ad un ciclo ho, per ogni iterazione
miaclasse_i, stringa_i, int_i
secondo me doveva funzionare la seguente operazione:
mappa[miaclasse(...)][stringa_i]=int_i;
infatti se non c'e' la prima chiave crea l'entry "nuova"
poi passa a valutare la sottomappa e, se non c'e' nulla (come sempre e', nel
mio ciclo)
la crea assegnandoli int_i.
se invece miaclasse1 c'e' restituisce la sottomappa associata
(e' qui che sbaglio?) e valuta stringa_i con lo stesso discorso
perche' invece non funziona e (penso) sovrascrive dei valori?


 std::map<miaclasse, std::map<std::string,int> > mappa
credo di aver trovato il problema, ma non ancora risolto!
il fatto e' che avevo definito "male" operator< che necessita x creare una
classe
con chiave oggetti user-defined. giusto, vero?
ecco la definizione:
class miaclasse{
    long a; (da 0 a N)
    long b; (da 0 a M)
    std::string c; //puo' essere N,S,O,E
    ...
    inline bool operator<(const miaclasse& dx) const{
        //che ci metto xche mi restituisca un valore "corretto"?
    }
};
io pensavo che tale operatore servisse solo x discriminare < e > , non per
stabilire l'identita'!
evidentemente mi sbagliavo...
che funzione posso/devo mettere affinche' tutto funzioni?
non vorrei tirare a caso!
grazie!


 non vorrei tirare a caso!
sostanzialmente devi rispettare queste condizioni (che poi sono due 
proprieta` intuitive che valgono anche sugli insiemi numerici usuali):
1) se x<y allora !(x<y)
2) !( x<y || x<y ) se e solo se a e b sono "equivalenti" (nel tuo caso 
potrebbe andare bene anche "uguali" al posto di equivalenti).
Una funzione che le rispetta potrebbe essere questa:
bool operator<(const miaclasse& x, const miaclasse& y)
{
        if (x.a < y.a) return true;
        if (x.b < y.b) return true;
        if (x.c < y.c) return true;
        return false;
}
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 }
uhm, la mia e' mooolto piu' complicata, basandomi sull'"ordinamento
totale"...
la tua funziona perfettamente, a buon rendere! :-)


 totale"...
scusa, ma cosa intendi con "ordinamento totale"? Se lo intendi dal punto 
di vista matematico quella che ho scritto io e` una relazione d'ordine 
totale. Cosa avevi scritto tu?


 }
e diciamo che "a" e "b" sono le due coordinate, non e' un "ordinamento
totale" come lo intendevo io, in quanto ad esempio
tutti i "punti" con x(a) minore sono minori, a prescindere dalla y(b).
o  magari anche il tuo lo e', ma non ne capisco "il percorso".
vabbe', mo' e' tardi, mi sa che ho sparato abbastanza x oggi! :-)
buonanotte by Allanon

 o  magari anche il tuo lo e', ma non ne capisco "il percorso".
beh, considerando che a e b sono coordinate discrete e` facile trovare 
il "percorso" (inteso come sequenza p1...pN di punti tale che pI<pJ per 
ogni 1<= I < J <=N).
Per semplicita` ipotizziamo che "a" assuma solo valori interi compresi 
in [1,3] e "b" solo interi in [1,2]. In quest'esempio non consideriamo 
la coordinata "c".
Il "percorso" che contiene tutti i punti e` questo (ogni punto e` 
rappresentato con (a,b) ):
(1,1)
(1,2)
(2,1)
(2,2)
(3,1)
(3,2)
Pero` questa definizione non si accorda con il significato "grafico" di 
percorso (se supponi di tracciare una linea che collega ogni coppia di 
punti consecutivi ti accorgi che "non funziona" nei passaggi da, ad 
esempio, (1,2) a (2,1); immagino fosse questo che tu intendevi, vero?


 esempio, (1,2) a (2,1); immagino fosse questo che tu intendevi, vero?
perfetto! :-)
