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#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <map>
#include <string>
#include <iterator>
using namespace std;
class MiFuncion{
map<string, int>& d;
public:
MiFuncion(map<string, int>& rd):d(rd){}
void operator()(pair<string, string> t){
map<string, int>::iterator i;
i = d.find(t.first);
if (i != d.end()) // Existe clave
d[t.first] += 1;
else
d.insert(i, pair<string,int>(t.first,1));
}
};
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;
}
};
int main ()
{
multimap<string, string> multi;
map<string,int> d;
cout << "Vaya insertando las claves en la forma K1, K2" << endl;
cout << "Presione ctrl+z para finalizar" << endl;
copy(istream_iterator<StrPair>(cin), istream_iterator<StrPair>(), inserter(multi, multi.begin()));
cout << endl << "Elementos del multidiccionario: " << endl;
for (multimap<string, string>::iterator it = multi.begin(); it != multi.end(); ++it)
{
cout << " [" << (*it).first << ", " << (*it).second << "]" << endl;
}
for_each (multi.begin(), multi.end(), MiFuncion(d));
cout << endl << "Elementos del diccionario: " << endl;
for (map<string, int>::iterator it = d.begin(); it != d.end(); ++it)
{
cout << " [" << (*it).first << ", " << (*it).second << "]" << endl;
}
return 0;
}