15/06/2008, 12:15
|
| | Fecha de Ingreso: junio-2008
Mensajes: 10
Antigüedad: 16 años, 6 meses Puntos: 0 | |
Respuesta: Ayuda con Funciones objeto (funtores) soy TONTO y estoy CIEGO MUCHISIMAS GRACIAS CalgaryCorpus no me di cuenta de ese const que me pusistes jodeeeeeeeeer y el error de compilación al ser tan grande me liaba...
os pongo el código final que compila perfectamente:
Código:
#include <pokedex.h>
#include <fstream>
struct funtor_findif {
funtor_findif(const string &n) : name(n) {}
bool operator()(const pokemon &p1) {
if( name==p1.dame_nombre() ) return true;
else return false;
}
string name;
};
struct funtor_accutotales {
map<string,int> operator() (map<string,int> &acum, const pokemon &p1) { // Epera el valor actual del acumulador, y el elemento que toca ahora en la nueva suma, con esto decides tu la nueva suma
pair<string,string> aux=p1.dame_tipos();
acum[aux.first]++;
if ( aux.second != "" ) {
acum[aux.second]++;
}
acum["Total"]++;
return acum;
}
};
struct funtor_accutipos {
set<string> operator() (set<string> &acum, const pokemon &p1) {
pair<string,string> aux=p1.dame_tipos();
acum.insert(acum.begin(),aux.first);
if ( aux.second != "" ) {
acum.insert(acum.begin(),aux.second);
}
return acum;
}
};
struct funtor_accudetipo {
public:
funtor_accudetipo(const string &t) : tipo(t) {}
vector<pokemon> operator() (vector<pokemon> &acum, const pokemon &p1) {
pair<string,string> aux=p1.dame_tipos();
if (aux.first==tipo) acum.push_back(p1);
if (aux.second==tipo) acum.push_back(p1);
return acum;
}
string tipo;
};
pokedex::pokedex() : data()
{
}
// Devuelve un objeto pokemon si existe en el conjunto
const pokemon & pokedex::info(const string & nombre)const {
set<pokemon>::iterator ret=find_if(data.begin(), data.end(), funtor_findif(nombre));
if ( ret != data.end() ) return *ret;
else {
cout<<"Error: Pokemon no existe"<<endl;
return *(data.end());
}
}
//
void pokedex::fusion(const pokedex & rhs) {
insert_iterator<set<pokemon> > itr_ins(data,data.begin());
set_union(rhs.data.begin(),rhs.data.end(),data.begin(),data.end(),itr_ins);
}
map<string,int> pokedex::totales() const { // accumulate y funcion objeto
// Retorna para cada tipo el numero de pokemons de dicho tipo
return accumulate(data.begin(), data.end(), map<string,int>(), funtor_accutotales());
}
set<string> pokedex::tipos() const {
/*acumulate y funtor*/
return accumulate(data.begin(), data.end(), set<string>(), funtor_accutipos());
}
vector<pokemon> pokedex::deTipo(const string & tipo) const {
/*acumulate y funtor*/
return accumulate(data.begin(), data.end(), vector<pokemon>(), funtor_accudetipo(tipo));
}
ostream & operator<<(ostream &out, const pokedex &px) {
ostream_iterator<pokemon> itr_out(out,"\n");
copy(px.data.begin(),px.data.end(),itr_out);
return out;
}
istream & operator>>(istream &in, pokedex &px) {
while(!in.eof()){
pokemon aux;
in>>aux;
px.data.insert(aux);
}
return in;
}
Última edición por shacklebolt; 15/06/2008 a las 13:16 |