 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Pugile Ens

Registrado: 26 Dic 2006Mensajes: 29Ubicación: Mexico
|
Publicado: Mar 23 Ago, 2011 8:01 am Asunto: Ayuda manejo contenedores STL |
|
|
Hola que tal a todos en el foro. Estoy tratando de crear una lista con varios documentos usando la STL, pero no doy con la mejor forma de hacerlo. Les comento a mas detalle el problema.
1.- Tengo N documentos de Texto en disco duro
2.- Los cargo en un string y elimino caracteres especiales como .-?¿()/&%$# etc.
3.- Descarto Stopwords.
4.- Tokenizo y Lematizo.
5.- Finalmente tengo una lista con las palabras que sirven del documeto y lematizadas.
Para el paso 5 uso un:
| Código: | multimap <string, int> ListDoc; |
Pues bien aqui entra mi duda y les explico el porque:
Ya que tengo el ListDoc lleno, ese multimap representa el archivo 1. Ahora debo hacer el mismo proceso para el archivo 2, 3, 4, N. Pero manteniendo los anteriores en memoria. Para ello se me ocurrio meter el multimap en un:
| Código: | list < multimap <string, int> > GeneralList; |
Es decir lo que pretendo es que el elemento 1 del list tenga todas las palabras del archivo 1 pero como si fuese un objeto. El elemento 2 que tenga las palabras del archivo 2, el elemento 3 de la lista las palabras del archivo 3 y asi sucesivamente. De manera que los elementos se vean mas o menos asi:
GeneralList
|
|
|------- archivo 1 como multimap
|
|
|------- archivo 2 como multimap
|
|
|------- archivo N como multimap
Mi duda surge al manejar el iterador del list, pues cuando declaro un iterador asi:
| Código: | list < multimap <string, int> > :: iterator it; |
E intento acceder a los elementos del multimap no puedo.
Para acceder debo crear un iterador a un multimap e asignarle el iterador del list algo asi:
| Código: | it = ListDoc.begin(); // Accedo al primer multimap (el del archivo 1)
multimap <string,int> :: iterator mt = it.operator *(); |
Entonces asi si ya puedo acceder a los elementos del pair para cada archivo.
| Código: | cout << (mt*).first;
cout << (mt*).second; |
Mi pregunta es:
¿Existe alguna forma mas practica y mejor de hacer esto? |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 25 Ago, 2011 12:03 am Asunto: |
|
|
El iterador al multimap lo necesitas para poder recorrer el contenido de cada uno de ellos en la lista. No se si te servirá de algo este pequeño ejemplo, pero es más o menos como tu lo estás haciendo:
| Código: | typedef multimap<string, int> TListDoc;
typedef list<TListDoc> TGeneralList;
TListDoc ListDoc;
TGeneralList GeneralList;
// Primera lista
ListDoc.insert(make_pair("pruebaA", 1));
ListDoc.insert(make_pair("otroA", 2));
ListDoc.insert(make_pair("pruebaA", 9));
GeneralList.push_back(ListDoc);
// Segunda lista
ListDoc.clear();
ListDoc.insert(make_pair("pruebaB", 11));
ListDoc.insert(make_pair("otroB", 22));
ListDoc.insert(make_pair("pruebaB", 99));
GeneralList.push_back(ListDoc);
TGeneralList::iterator it;
for (it = GeneralList.begin(); it != GeneralList.end(); ++it)
{
cout << "---" << endl;
for (TListDoc::iterator mt = it->begin(); mt != it->end(); ++mt)
cout << mt->first << " : " << mt->second << endl;
} |
|
|
| Volver arriba |
|
 |
Pugile Ens

Registrado: 26 Dic 2006Mensajes: 29Ubicación: Mexico
|
Publicado: Jue 25 Ago, 2011 3:10 am Asunto: |
|
|
| Gracias _Leo por tu ejemplo. Y pues si efectivamente, la forma que presentas es muy similar a como lo hago. Lo que tenía duda es si el proceso se podía optimizar con algún otro contenedor y el acceso a los elementos se podría hacer sin usar un 2do iterador. De nuevo gracias por responder. |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|