Ver Mensaje Individual
  #5 (permalink)  
Antiguo 23/06/2010, 16:22
fightmx
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 2 meses
Puntos: 22
Respuesta: Como se utiliza Función Objeto? :( Ayuda porfavor !!!!

En terminos generales se puede decir que va bien lo que estás haciendo pero ojo con lo siguiente:

istream_iterator<pair<string, string>> in (cin);

La clase pair no tiene sobrecargado el operador de inserción ">>", esto es necesario para trabajar con istream_iterator.

Para resolver esto de forma simple, puedes crearte una nueva clase digamos StrPair que herede de pair y que solo maneje pares de strings para que puedas sobrecargar el operador de inserción.

Ejemplo:

Código:
class StrPair : public pair<string, string>{
public:
	StrPair(const string& s1 = "", const string& s2 = ""):pair(s1, s2){}
	friend istream& operator>>(istream& is, StrPair& sp){
		return is >> sp.first >> sp.second;
	}
};
También puedes utilizar inserter en la función copy.

Ejemplo:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <vector>
  3. #include <iterator>
  4. #include <algorithm>
  5. #include <map>
  6. #include <string>
  7. #include <iterator>
  8.  
  9. using namespace std;
  10.  
  11. class MiFuncion{
  12.     map<string, int>& d;
  13. public:
  14.     MiFuncion(map<string, int>& rd):d(rd){}
  15.     void operator()(pair<string, string> t){
  16.         map<string, int>::iterator i;
  17.         i = d.find(t.first);
  18.         if (i != d.end()) // Existe clave
  19.             d[t.first] += 1;
  20.         else
  21.             d.insert(i, pair<string,int>(t.first,1));
  22.     }
  23. };
  24.  
  25. class StrPair : public pair<string, string>{
  26. public:
  27.     StrPair(const string& s1 = "", const string& s2 = ""):pair(s1, s2){}
  28.     friend istream& operator>>(istream& is, StrPair& sp){
  29.         return is >> sp.first >> sp.second;
  30.     }
  31. };
  32.  
  33. int main ()
  34. {
  35.  
  36.     multimap<string, string> multi;
  37.     map<string,int> d;
  38.  
  39.     cout << "Vaya insertando las claves en la forma K1, K2" << endl;
  40.     cout << "Presione ctrl+z para finalizar" << endl;
  41.  
  42.     copy(istream_iterator<StrPair>(cin), istream_iterator<StrPair>(), inserter(multi, multi.begin()));
  43.  
  44.     cout << endl << "Elementos del multidiccionario: " << endl;
  45.     for (multimap<string, string>::iterator it = multi.begin(); it != multi.end(); ++it)
  46.     {
  47.         cout << "  [" << (*it).first << ", " << (*it).second << "]" << endl;
  48.     }
  49.  
  50.     for_each (multi.begin(), multi.end(), MiFuncion(d));
  51.  
  52.     cout << endl << "Elementos del diccionario: " << endl;
  53.     for (map<string, int>::iterator it = d.begin(); it != d.end(); ++it)
  54.     {
  55.         cout << "  [" << (*it).first << ", " << (*it).second << "]" << endl;
  56.     }
  57.  
  58.     return 0;
  59. }