map2list.cpp
// $Id$
/*
COMIENZO DE DESCRIPCION
__USE_WIKI__
Escribir las funciones #map2list()#
y #list2map()# de acuerdo a las siguientes especificaciones.
#void map2list(map<int,int> &M,list<int> &keys,list<int> &vals);#
dado un map #M# retorna las listas de claves y valores.
#void list2map(list<int> &keys,list<int> &vals,map<int,int> &M);#
dadas las listas de claves #(k1,k2,k3...)# y valores #(v1,v2,v3...)#
retorna el map #M# con las asignaciones correspondientes
#{(k1,v1),(k2,v2),(k3,v3),...}#. (Nota: Si hay
*claves repetidas*, solo debe quedar la asignacion
correspondiente a la *ultima* clave en la lista. Si hay menos
valores que claves, utilizar cero como valor. Si hay mas valores
que claves, ignorarlos).
[Tomado en Primer Parcial 17-SET-2009].
keywords: correspondencia, lista
FIN DE DESCRIPCION */
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
#include <cstdio>
#include <cstdlib>
#include <cstdarg>
#include <string>
#include <list>
#include <map>
#include "./util.h"
using namespace std ;
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void map2list(map<int,int> &M,
list<int> &keys,list<int> &vals) {
// limpia las listas
keys.clear();
vals.clear();
map<int,int>::iterator q = M.begin();
while (q!=M.end()) {
// Para cada asignacion, simplemente carga clave
// y valor en la lista correspondiente
keys.push_back(q->first);
vals.push_back(q->second);
q++;
}
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void list2map(list<int> &keys, list<int> &vals,
map<int,int> &M) {
M.clear();
// `q' y `r' iteran sobre posiciones correspondientes
// en `keys' y `vals'
list<int>::iterator q=keys.begin(), r=vals.begin();
// Carga la asignacion en M. Si hay claves
// repetidas va a quedar la ultima, que es lo que pide
// el enunciado.
while (q!=keys.end() && r!=vals.end()) M[*q++] = *r++;
// Si llegamos aca es porque alguna de los dos listas se acabo.
// Si se acabo `keys' entonces no hay que hacer nada y el
// lazo siguiente no se ejecuta ninguna vez. Si se acabo `vals'
// entonces el lazo siguiente asigna a las claves restantes el valor 0
while (q!=keys.end()) M[*q++] = 0;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
// Funcion auxiliar que imprime el map
void print_map(map<int,int> &M,const char *s=NULL) {
if (s) printf("%s: ",s);
#if 0
map<int,int>::iterator q = M.begin();
while (q!=M.end()) {
printf("(%d->%d) ",q->first,q->second);
q++;
}
#else
#define iter(cont,q) for(typeof(cont.begin()) q=cont.begin(); q!=cont.end(); q++)
#endif
iter(M,q)
printf("(%d->%d) ",q->first,q->second);
printf("\n");
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
list<int> keys,vals,keys2,vals2;
map<int,int> M,M2;
// La clave 1 esta repetida y hay un valor de mas.
// Ademas las claves estan desordenadas.
int keysp[] = {4,1,2,1,-1};
int valsp[] = {2,3,3,5,6,-1};
insertl(keys,keys.begin(),keysp,-1);
insertl(vals,vals.begin(),valsp,-1);
printf("keys: "); printl(keys);
printf("vals: "); printl(vals);
list2map(keys,vals,M);
print_map(M,"M despues de list2map(keys,vals,M)");
map2list(M,keys2,vals2);
printf("\nDespues de map2list(M,keys2,vals2)\n");
printf("keys2: "); printl(keys2);
printf("vals2: "); printl(vals2);
printf("keys2==keys? %s\n",(keys2==keys? "si" : "no"));
printf("vals2==vals? %s\n",(vals2==vals? "si" : "no"));
list2map(keys2,vals2,M2);
print_map(M2,"\nM2 despues de list2map(keys2,vals2,M2)");
// Deberia ser M2==M
printf("M2==M? %s\n",(M2==M? "si" : "no"));
return 0;
}
Generated by GNU Enscript 1.6.6.