Ahora añadire la función de orden.
Solo hay un problema:
- Los maps por defecto son contenedores automaticamente ordenados por la Key. Con lo que no se puede ordenar por valor, y por lo tanto, no es trivial obtener las palabras mas frequentes. Ademas, si fuera la MAS frequente, un simple algoritmo de busqueda de la palabra mas frequente basta, buscando en los it->second.
Pero resulta que pueden ser mas de X palabras a obtener, con lo que el algoritmo ya no es trivial.
Lo que intentaré, es obtener un Map swapeado, de tal manera que quedando ya ordenado automaticamente se puedan obtener las palabras de mas frequencia de aparición.
A ver si se me ocurre...
(con lo facil que es el Python... xDDDD)
EDIT:
Ya te lo tengo.
Es una funcion que le pasas por parámetro el numero de palabras que quieres contemplar. Por ejemplo, las 25 que comentabas, o 3 en mi caso de ejemplo que te enseñaré.
Y te las imprime por pantalla.
Si las quieres devolver, crea un vector o algo y guardalas.
No se si podras usar multimaps, supongo que si te dejan trabajar con la libreria Map, será que sí. Lo bueno de estos, es que guardas el contenido del Map en el multimap, pero con el orden cambiado (Key-Val --> Val-Key; manualmente debes hacerlo) y te permite repetir claves, con lo que palabras que aparezcan 2 veces pueden haber muchisimas.
Luego está claro, que se ordena de forma reversa (ya que por defecto lo hace ascendientemente) y de hecho, ni lo ordeno, sencillamente cojo un iterador reverso, es decir, recorro el map a la inversa. Y finalmente, contemplando en todo momento que no "se salga" del map y se provoque overflow, se van mostrando las palabras hasta que o bien se acaba el map, o bien se llega al tope fijado por el parámetro de entrada. Osea, si el map tiene 30 cosas dentro, pero el parametro es 5, pues a 5 palabras parará. Pero si hay 30 cosas y le metes de parámetro 543, pues sencillamente te muestra las 30 que hay y punto.
Y esto es todo. Una funcion mas.
Te la añado y te resubeo el codigo.
Saludos!
Nueva funcion:
void getMasFrequentes(int X){
multimap<int,string> frequentes; //se crea un multimap, que permite keys repetidas.
int cont=0;
//se recorre el map entero, swapeando los valores e insertandolos en el multimap.
for(map<string,int>::iterator it = apariciones.begin(); it!=apariciones.end(); it++){
frequentes.insert( pair<int,string>(it->second,it->first) );
}
cout << "\n\nPalabras mas frequentes [" << X << "]:\n" << endl;
//Obtenemos un iterador reverso (para orden descend), dado el orden natural ascend del multimap:
for(multimap<int, string>::reverse_iterator itMM = frequentes.rbegin(); itMM != frequentes.rend() && cont<X; itMM++ ) {
cout << ">> Apariciones: " << itMM->first << " -- Palabra: " << itMM->second << endl;
cont++;
}
}
Y la llamo al main así:
getMasFrequentes(3);
ejemplo:
Te dejo el link del codigo aquí:
http://www.megaupload.com/es/?d=MJZU78M9
NOTA: la funcion esta solo tiene en cuenta el numero que le pasas. Osea, si le dices 7, te devuelve las 7 mas frequentes de mas a menos, hasta 7. Pero si por ejemplo tienes la primera que sale 4 veces, la segunda 3, y despues hay 50 palabras que salen 2 veces, solamente tendras la de 4, la de 3, y 5 palabras mas que aparecen 2 veces, que seran las que sean. Ordenadas segun STL, no segun yo.
Podrias modificar la funcion para que te avisara de que hay mas palabras de la misma cantidad de la ultima que muestras, pero que no estas mostrando. Me explico? xDDD
Saludos.