PDA

View Full Version : [C++] Problema con iterator di una map


Manugal
21-05-2007, 17:11
Ciao.

Ho un nuovo problema nel progetto che sto sviluppando. Ho una classe definita in questo modo:


class Dns{
private:
vector< int > proxy;
vector< Provider > provider;
map< string, vector<int> > mapper;
vector< Tabella > table; Client-Proxy
public:
Dns(); // costruttore di default
Dns(vector<int>& , vector<Provider>& );
void Associations(int, int);
void stampa_mapper(int []);
int RequestDNS(const int, const string&);
};

La map di nome mapper viene riempita ciclicamente nella funzione Associations tramite un'istruzione del tipo

mapper.insert(pair<string,vector<int> >(provider[i].nome_provider,tmp));


stampa_mapper è la funzione che mi stampa il mapper ed è fatta così:

void Dns::stampa_mapper(int nproxy[]){
map<string,vector<int> >::iterator it_first;
vector<int>::iterator it_second;
for(it_first=mapper.begin(); it_first != mapper.end(); ++it_first){
cout << it_first->first << endl;
cout << "Proxy in questo provider: " << it_first->second.size() << endl;
for(it_second=it_first->second.begin(); it_second != it_first->second.end(); ++it_second)
cout << *it_second << endl;
system("PAUSE");
}
}


Ora il problema viene con la RequestDNS(). Praticamente per l'iteratore eseguo quasi la stessa operazione che ho fatto in stampa_mapper (cioè creo un'iteratore map< string, vector<int> >::iterator imm) e poi provo a fare

imm = mapper.find(una certa stringa);

Controllando con gdb l'indirizzo dell'iteratore vedo che è tutto a posto. Solo che se faccio imm->first o imm->second mi dice "There is no member or method named first (o second)". Non riesco a capire per quale motivo! :confused:

Ho bisgono del vostro aiuto. Grazie. :)

Manugal
21-05-2007, 18:22
Ora sembra che funzioni. E questo solo perché ho scritto:

map<string,vector<int> >::iterator imm = mapper.find(prov);

invece di:

map<string,vector<int> >::iterator imm;
imm = mapper.find(prov);

ancora più :confused: :confused: . Com'è possibile?

marco.r
21-05-2007, 18:48
Ora sembra che funzioni. E questo solo perché ho scritto:

map<string,vector<int> >::iterator imm = mapper.find(prov);

invece di:

map<string,vector<int> >::iterator imm;
imm = mapper.find(prov);

ancora più :confused: :confused: . Com'è possibile?

Probabilmente perche' sono due cose distinte. Quella che avevi scritto prima era una dichiarazione, la seconda e' una dichiarazione con inizializzazione. In particolare nel secondo caso compilatore ha una serie di informazioni in piu' (il tipo ritornato da mapper.find(prov) ) che priobabilmente sono sufficienti per la disambiguazione. Secondo me ce l'aveva anche prima, ma lo standard non l'ho scritto io ( e neanche il compilatore, visto che non e' detto che il secondo segua pedissequamente il primo ) :stordita: :D

Manugal
21-05-2007, 19:06
Ah ho capito. Grazie. Sempre più misterioso sto C++ :stordita: