PDA

Visualizza la versione completa : [c++] ricercare una stringa in un vector


namelessg
18-08-2014, 10:29
ciao a tutti

allora ho la classe Nodo



class Nodo{
private:
vector<short> adiacenza;
string nome;
public:
Nodo(){};
void set_nome(string nome_nodo){nome=nome_nodo;};
void mostra_nome(){cout<<nome;}
string get_nome(){return nome;}
void agg_nodo_adiac(short ad){adiacenza.push_back(ad);};
int get_size_ad(){return adiacenza.size();};
short get_ad(short i){return adiacenza[i];};
~Nodo(){};
};



e poi ho un vector
vector<class Nodo> nodi;

ora voglio trovare nel vector nodi se esiste un nodo con un certo nome

posso usare find?
in questo modo?

elemento = find(nodi.begin(),nodi.end(),nome_nodo_adiacente);

elemento è un iteratore dichiarato cosi:
vector <class Nodo>::iterator elemento;

perchè quando compilo mi si apre il file stl_algo.h e non va a buon fine
cosa sbaglio

grazie in anticipo

Scara95
19-08-2014, 08:06
Hai un vettore di oggetti Nodo, non puoi cercare una string.
A parte che dovrebbe essere

vector<Nodo> nodi;

namelessg
19-08-2014, 09:25
Nel senso che non è possibile trovare stringhe con find?

Scara95
19-08-2014, 11:53
QUOTE: (http://www.cplusplus.com/reference/algorithm/find/)



template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);
[...]
The function uses operator== to compare the individual elements to val.
[...]

Come puoi comparare un oggetto Nodo e un oggetto string con operator== ?

namelessg
19-08-2014, 12:02
Capito è che

il vector è un vector di oggetti nodi
E il nome sta nella variabile nome che si può accedere con getnome
E quindi non posso usare find

MItaly
19-08-2014, 12:50
In realtà puoi a patto di usare find_if con un functore custom per il confronto; in C++11 con una lambda è immediato:


elemento = find_if(nodi.begin(),nodi.end(),
[=](Nodo &n)
{
return n.get_nome() == nome_nodo_adiacente;
});

In C++03 devi stare a definire un functore separato (ad esempio con una struct e ridefinendone l'operator()), per cui di fatto fai prima a ciclare "a mano" sul vettore.

Loading