PDA

View Full Version : Map


Ayako
08-05-2007, 15:13
Buongiorno a tutti,
sto usando la struttura map del C++ del tipo
map<char*,int>mapPippo
il char che farebbe da chiave viene letto da un file esterno e messo in un char chiamato pippo.

Ora siccome di chiavi sul file ce ne è più di una, ma a priori non so quante saranno, il caricamento della mappa è dentro un while del tipo
char pippo[4];
while(!f1.eof()){
for(int i=1;i<4;i++){
pippo[i]=f1.get();
}
mapPippo[pippo] = index++;

}

Il punto è che per essere una chiave di una mappa, la memoria dedicata a pippo deve essere nuova tutte le volte, perchè così com'è, passandogli un puntatore, scrivo nella stessa zona e ottengo solo l'ultimo elemento all'interno della mappa. Come posso fare. Spero di essere stata chiara.

Grazie Ayako

cionci
08-05-2007, 15:33
Direi che sarebbe meglio usare una string...

map<string, int> mapPippo;

string pippo;
while(!f1.eof()){
for(int i=1;i<4;i++){
pippo.append(1, f1.get());
}
mapPippo[pippo] = index++;

}

Ayako
08-05-2007, 15:51
grazie, provo subito

Ayako
08-05-2007, 16:01
il problema sta nel fatto che pippo è sempre la stessa zona di memoria per n chiavi e quindi la mappa non si riempie ma scrive solo ciò che legge nell'ultima chiave.

Cioè se io riempissi la mia mapPippo
come mapPippo["Pluto"]=1;
mapPippo["Paperino"]=2;
mapPippo["minni"]=3;
avrei 3 differenti zone di memoria: quella allocata da pluto, quella di paperino e quella di minni.

Nel mio caso, non sapendo a priori quanti elementi avrò, come faccio ad "istanziare" n elementi da passare alla mappa? :cry:

cionci
08-05-2007, 16:04
Con la string non hai di questi problemi perchè viene passata per copia...

cionci
08-05-2007, 16:39
Guarda questo:

#include <iostream>
#include <string>
#include <map>

using namespace std;

int main()
{
map <string, int> m;
string pippo;

pippo = "uno";
m[pippo] = 1;

pippo = "due";
m[pippo] = 2;

pippo = "tre";
m[pippo] = 3;

cout << "Num = " << m.size() << endl;
cout << "uno = " << m["uno"] << endl;
cout << "due = " << m["due"] << endl;
cout << "tre = " << m["tre"] << endl;
}