concatmap.cpp
//__INSERT_LICENSE__
// $Id$
#include <cstdio>
#include <cstdlib>
#include <list>
#include <map>
#include "./util.h"
using namespace std;
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
Escribir una funci\'on
#void concat_map(map<int,list<int> >& M, list<int>& L);# tal que
reemplaza los elementos de #L# por su imagen en #M#. Si un
elemento de #L# no es clave de #M# entonces se asume que su imagen
es la lista vac\'\i{}a.
[Tomado en el primer parcial del cursado 2010, 2010-09-14.]
keywords: lista, correspondencia
FIN DE DESCRIPCION */
// -------------------------------------------------------------------
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void concat_map(map<int,list<int> >& M, list<int>& L) {
// `p' recorre la lista
list<int>::iterator p=L.begin();
while (p!=L.end()) {
// Toma la clave en una variable auxiliar `k'
// y elimina el elemento
int k = *p;
p = L.erase(p);
// Busca si hay una entrada en el map
map<int, list<int> >::iterator q = M.find(k);
// Si la entrada esta inserta la lista
if (q!=M.end()) {
// L2 es una ref a la lista en el map
list<int> &L2 = q->second;
list<int>::iterator r = L2.begin();
while (r!=L2.end()) {
// inserta en la posicion `p' que quedo en `L'
p = L.insert(p,*r++);
p++;
}
}
}
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
// Genera un map con MAPSZ claves en [0,NK)
// LSZ es el tamano en promedio de las listas
// Los elementos de la lista estaen en [0,NELEM)
int NK = 15, MAPSZ=10, LSZ=3, NELEM=5;
for (int j=0; j<5; j++) {
printf("\n\n----------------\n");
map<int,list<int> > M;
for (int j=0; j<MAPSZ; j++) {
int key = rand()%NK;
// Inserta la clave y se queda con una ref
// a la lista
list<int> &L = M[key];
L.clear();
while(rand()%LSZ)
L.push_back(rand()%NELEM);
}
print_map(M);
list<int> L;
for (int j=0; j<MAPSZ; j++)
L.push_back(rand()%NK);
printl(L);
concat_map(M,L);
printl(L);
}
return 0;
}
Generated by GNU Enscript 1.6.6.