util.h
// -*- mode: c++ -*-
//__INSERT_LICENSE__
// $Id$
/*
COMIENZO DE DESCRIPCION
Utilitarios varios.
keywords: lista, cola
FIN DE DESCRIPCION
*/
#ifndef AED_UTIL_H
#define AED_UTIL_H
#include <cstdarg>
#include <string>
#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
// -----------------------------------------------------------------
// generates a double random between 0.0 <= d < 1.00
double drand();
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int modulo(int n,int m);
// -----------------------------------------------------------------
// generates an integer random between 0 <= i < M-1
int irand(int m);
// -----------------------------------------------------------------
// Genera una lista L de longitud N
// con elementos aleatorios en el rango [0, M-1]
void randl(std::list<int> &l,int m=10,int n=20);
// -----------------------------------------------------------------
// Genera una lista L de longitud promedio N
// con elementos aleatorios en el rango [0, M-1]
void randl(std::list<int> &l,int m=10,double n=20.0);
// -----------------------------------------------------------------
// Inserta elementos del vector v en la lista l en la posicion p.
// Se detiene cuando encuentra el elemento term en v.
// Util para generar listas de la siguiente forma:
// int v [] = {1,2,3,4,3,2,1,2,3,4,-1};
// list <int> l ; insertl (l,v,-1);
// -----------------------------------------------------------------
template <class t>
void insertl(std::list<t> &l,
typename std::list<t>::iterator p,
t *x,t term) {
while (*x!=term) {p=l.insert(p,*x++); p++;}
}
template <class t>
void insertl(std::list<t> &l,t *x,t term) {
insertl(l,l.begin(),x,term);
}
// -----------------------------------------------------------------
// imprime en orden normal (de adelante para atras)
template <class t>
void printl(std::list<t> &l) {
typename std::list<t>::iterator p;
p=l.begin();
while (p!=l.end()) std::cout << *p++ << " ";
std::cout << std::endl;
}
// -----------------------------------------------------------------
// imprime en orden inverso (por recursion, de atras para adelante)
template <class t>
void pinvers(std::list<t> &l,
typename std::list<t>::iterator p) {
typename std::list<t>::iterator q;
if (p==l.end()) return;
q=p; q++;
pinvers(l,q);
std::cout << *p << " ";
}
template <class t>
void printl_inv(std::list<t> &l) {
pinvers(l,l.begin());
std::cout << std::endl;
}
// -----------------------------------------------------------------
// Imprime cola sin destruirla (i.e. usa una cola auxiliar)
template <class t>
void printq(std::queue<t> &q) {
std::queue<t>c;
t x;
while (!q.empty()) {
x=q.front();
std::cout << x << " ";
q.pop();
c.push(x);
}
while (!c.empty()) {
q.push(c.front());
c.pop();
}
std::cout << std::endl;
}
template<class T>
void set_union(std::set<T> &A,std::set<T> &B,
std::set<T> &C) {
C.clear();
std::set_union(A.begin(),A.end(),
B.begin(),B.end(),
inserter(C,C.begin()));
}
template<class T>
void set_intersection(std::set<T> &A,std::set<T> &B,
std::set<T> &C) {
C.clear();
std::set_intersection(A.begin(),A.end(),
B.begin(),B.end(),
inserter(C,C.begin()));
}
template<class T>
void set_difference(std::set<T> &A,std::set<T> &B,
std::set<T> &C) {
C.clear();
std::set_difference(A.begin(),A.end(),
B.begin(),B.end(),
inserter(C,C.begin()));
}
void add_to_list(std::list<int> &L,int term,...);
void add_to_list(std::list<int> &L,int term,va_list elems);
void add_to_set(std::set<int> &L,int term,...);
void add_to_set(std::set<int> &L,int term,va_list elems);
// Imprime una correspondencia
void print_map(std::map<int,std::list<int> > &M,const char *s=NULL);
// Imprime una pila de enteros
void print_stack(std::stack<int> &S);
#endif
// -----------------------------------------------------------------
Generated by GNU Enscript 1.6.6.