PDA

View Full Version : dubbio su mappe c++


Arpeda
06-06-2002, 11:11
Ciao ragazzi,
sto facendo un programmino che deve gestire le iscrizioni agli esami da parte di studenti, il tutto in c++.

avevo intenzione di gestire la cosa tramite una mappa avente per chiave l'esame (data, nome esame, docente, aula) e per valore una lista di studenti (matricola, nome e cognome), ora ho alcuni dubbi su questa possibile realizzazione.
1) posso mettere come chiave un oggetto di una classe che ho creato io, (in questo caso esame)?
2) per stampare la lista delle chiavi, esiste una funzione in particolare, oppure devo usare gli iteratori, per scandire tutta la mappa?

Ciao
Arpeda

cionci
06-06-2002, 13:08
Cos'è una mappa ? Non è meglio usare un db ?

Arpeda
06-06-2002, 13:29
purtroppo non posso usare un DB. il programma serve solo come esercizio sulle classi e sulla stl.

una mappa è un tipo di contenitore astratto, e viene definito nella Standard Template Lybrary. se non vuoi chiamarla mappa chiamala dizionario.

map <key, value> pippo;

Ciao
Arpeda

cionci
06-06-2002, 13:42
Ah...ok... Probabilmente è una specie di Hash table...
Non l'ho mai usata...

In teoria puoi mettere anche una classe creata da te...
Comunque credo che la chiave debba avere alcune caratteristiche...ad esempio suppongo che debba avere almeno qualche operatore di confronto...
Poi magari funziona con una Hash table che si basa sul contenuto in memoria della chiave...

Boh...non so che dirti...fai qualche prova...

/\/\@®¢Ø
06-06-2002, 18:59
Originariamente inviato da Arpeda
[B]
1) posso mettere come chiave un oggetto di una classe che ho creato io, (in questo caso esame)?

Si', devi solo fornire un modo per confrontare le chiavi, visto che la map di solito e' implementata come un albero di ricerca. Puoi farlo in due modi : implementando l' "operator <" per la classe chiave, oppure fornendo un oggetto funzione ( o anche una semplice funzione ) di confronto. Quest'ultima e' molto comoda per usare diversi criteri di confronto per le stesse chiavi ( su mappe diverse ovviamente ).
In alternativa puoi passare fare una mappa che usi come chiave puntatori agli oggetti, la mappa userà come valore di confronto il valore del puntatore ( anche se ovviamente il significato della mappa cambia un po' ).

Ad esempio

1 - Con operator <

class Esame
{
/* ... */
bool operator < ( const Esame& ) const;
};

map<Esame, vector<Studenti> > x;
// ...


2 - Con oggetto di paragone

class Esame
{
/* ... */
};

struct EsameCmp
{
bool operator()( const Esame& x , const Esame& y )
};

map<Esame, vector<Studente>, EsameCmp > x;
/* ... */



e infine la versione con puntatori


class Esame
{
/* ... */
};

map< Esame* , vector<Studenti>* > x;



[b]
2) per stampare la lista delle chiavi, esiste una funzione in particolare, oppure devo usare gli iteratori, per scandire tutta la mappa?

Ciao
Arpeda

No non c'e', la cosa piu' semplice e' applicare gli iteratori.

Arpeda
06-06-2002, 19:54
grazie proverò
ciao
Arpeda

/\/\@®¢Ø
06-06-2002, 21:08
Un'ultima cosa : se usi i puntatori ma vuoi comunque confrontare il contenuto dovrai nuovamente usare un oggetto di confronto, cioe' map<Esame,...,EsameCmp>, dove ora pero' EsameCmp prende come argomenti puntatori agli oggetti.