Ver Mensaje Individual
  #10 (permalink)  
Antiguo 15/06/2008, 12:15
shacklebolt
 
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