submap.cpp

/* COMIENZO DE DESCRIPCION

   __USE_WIKI__
  // Dada una correspondencia #map<string,string> M#, y una clave #k0#, se
  // desea extraer todos los pares de asignacion correspondientes a claves
  // conectadas con #k0#. 
   [Tomado en primer parcial 2011-09-13].
   keywords: correspondencia

  FIN DE DESCRIPCION */
// -------------------------------------------------------------------

#include <cstdio>
#include <cassert>
#include <cmath>

#include <map>
#include <algorithm>

#include "./util.h"

using namespace std;

// Lo hacemos templatizado
template<typename T>
void submap(map<T,T> &M1,map<T,T> &M2,T k0) {
  T k1;
  while (1) {
    // Si k0 no es clave de M1 el proceso termino
    typename map<T,T>::iterator q = M1.find(k0);
    if (q==M1.end()) break;
    // k1=M[k0], si k1 ya esta en M2 tambien termino
    if (M2.find(k0)!=M2.end()) break;
    k1 = M1[k0];
    // Agrega la asignacion k0->k1 en M2
    M2[k0] = k1;
    // Pasa a la siguiente clave k1
    k0 = k1;
  }
}

// Funcion auxiliar que imprime un map
void printmap(map<int,int> &M) {
  map<int,int>::iterator q = M.begin();
  while (q!=M.end()) {
    printf("(%d->%d) ",q->first,q->second);
    q++;
  }
  printf("\n");
}

int main() {
  // Genera un map aleatorio de [0,N) en [0,N)
  map<int,int> M1,M2;
  int N = 20;
  for (int j=0; j<N; j++) {
    M1[rand()%N] = rand()%N;
  }
  printf("M1: ");
  printmap(M1);

  // Extrae el submap para las claves a partir de cada uno de los
  // j en [0,N)
  for (int j=0; j<N; j++) {
    map<int,int> M2;
    submap(M1,M2,j);
    printf("submap(M1,M2,%d): ",j);
    printmap(M2);
  }
  return 0;
}

Generated by GNU Enscript 1.6.6.