Foros del Web » Programación para mayores de 30 ;) » C/C++ »

duda iteradores

Estas en el tema de duda iteradores en el foro de C/C++ en Foros del Web. hola. estoy haciendo una guia de telefonos, y me estoy liando bastante al intentar hacer la clase iterador. este es mi codigo: Código: #include "diccionario.h" ...
  #1 (permalink)  
Antiguo 18/01/2013, 13:17
 
Fecha de Ingreso: enero-2013
Mensajes: 3
Antigüedad: 11 años, 3 meses
Puntos: 0
duda iteradores

hola. estoy haciendo una guia de telefonos, y me estoy liando bastante al intentar hacer la clase iterador.

este es mi codigo:
Código:
#include "diccionario.h"

class GuiaTlf{
  
    private:      
      Diccionario<string,string> tlf;      
    public:
      GuiaTlf():tlf(Diccionario<string,string>()){}
      GuiaTlf(const string &nombre, const string &tlf){ this->tlf.Insertar(nombre,vector<string>(tlf)); }
      GuiaTlf(const GuiaTlf &guia): tlf(guia) {}
      ~GuiaTlf() {}
      GuiaTlf & operator=(const GuiaTlf &guia) { tlf=guia; return *this; }
      vector<string> getTlf(const string &nombre) const { return tlf.getInfo_Asoc(nombre); }
      void setTlf(const string &nombre, const string &tlf){
	vector<string> aux(tlf);
	vector<pair<string,vector<string>>::iterator it;
	if(!tlf.Esta_Clave(nombre,it2))
	  tlf.Insertar(nombre,aux);
	else
	  (*it).second=aux;
      }
      
      class iterator{
	  Diccionario<string,string> *punt;//no se si esta bien
	public:
	  iterator(){}
	  iterator(const iterator &it):punt(it.punt){}
	  iterator & operator=(const iterator &it){ punt=it.punt; return *this; }
	  iterator & operator++(){punt++; return *this;}
	  iterator & operator--(){punt--; return *this;}
	  bool operator==(const iterator &it) {return punt==it.punt);}
	  bool operator!=(const iterator &it) {return punt!=it.punt);}
	  Diccionario<string,string> & operator*() {return *punt;}
	  friend class Diccionario;
      };

      class const_iterator{
	  Diccionario<string,string> *punt;
	public:
	  const_iterator(){}
	  const_iterator(const const_iterator &it):punt(it.punt){}
	  const_iterator(const iterator &it):punt(it.punt){}
	  const_iterator & operator=(const iterator &it){ punt=it.punt; return *this; }
	  const_iterator & operator++(){punt++; return *this;}
	  const_iterator & operator--(){punt--; return *this;}
	  bool operator==(const const_iterator &it) {return punt==it.punt);}
	  bool operator!=(const const_iterator &it) {return punt!=it.punt);}
	  const Diccionario<string,string> & operator*() const {return *punt;}
	  friend class Diccionario;
      };
      
      iterator begin(){
	iterator it;
	it.punt=
la clase Diccionario (creo que es basicamente como un map) es esta:
Código:
#ifndef DICCION__H
#define DICCION__H
#include <utility> // para pair
#include <vector>
using namespace std;
template <class t1,class t2>
class Diccionario{
	  private:
	    vector<pair<t1,vector<t2> > > data;

	  
	     void Copiar(const Diccionario<t1,t2> &D){
			  data = D.data;
	     }
	     void Borrar(){
			   data.erase(data.begin(),data.end());
	     }
	  public:	
	     /*Contructor por defecto*/	    
	     Diccionario():data(vector<pair<t1,vector<t2> > >()){}
	     Diccionario(const Diccionario &D){
		    Copiar(D);
	     }
	     /*Destructor*/
	     ~Diccionario(){}
	     /*Operador de asignacion*/
	     Diccionario<t1,t2> & operator=(const Diccionario<t1,t2> &D){
			   if (this!=&D){
				     Borrar();
				     Copiar(D);
			   }
			   return *this;
	    }
	    /*Devuelve si el elemento con un determinada clave (p) está en el diccionario.
	    Si está devuelve true y un iterador apuntando a donde está
	    En caso contrario devuelve false y un iterador indicando donde debe ser insertado
	    */
	    bool Esta_Clave(const t1 &p, typename  vector<pair<t1,vector<t2> > >::iterator &it_out){
			  
			  if (data.size()>0){
				    
			      typename vector <pair <t1,vector<t2> > >::iterator it;
			      
			      for (it=data.begin(); it!=data.end() ;++it){
					if ((*it).first==p) {
						  it_out=it;
						  return true;
					}
					else if ((*it).first>p){
						  it_out=it;
						  return false;
					}	  
					   
			      }
			      
			      it_out=it;
			      return false;
			  }
			  else {
				    
				    it_out=data.end();
				    return false;
			  }	    
		 }
		 
		 /*Inserta un nuevo elemento en el diccionario, si no existe la clave.*/
		 
		 void Insertar(const t1 & clave,const vector<t2> &info){
			   
		     typename vector <pair <t1,vector<t2> > >::iterator it;
		     
		     if (!Esta_Clave(clave,it)){
			       pair <t1,vector<t2> > p;
			       p.first = clave;
			       p.second=info;
			 
			       /*Usamos el metodo insertar de vector*/
			       data.insert(it,p);
			       
			       
			      	 
		     }
		     
		 }
		 
		 void AddSignificado_Palabra(const t2 & s ,const t1 &p){
			   typename vector<pair<t1,vector<t2> > >::iterator it;
			   pair<t1,vector<t2> > aux;
			   aux.first=p;
			   if (!Esta_Clave(p,it)){
				    data.insert(it,aux);
			   }	    
			   
			    //Insertamos el siginificado al final
		           (*it).second.insert(s);
		 }
		  vector<t2>  getInfo_Asoc(const t1 & p) {
			   typename vector<pair<t1,vector<t2> > >::iterator it;
			   if (!Esta_Clave(p,it)){
				return vector<t2>();
			   }
			   else{
				return (*it).second;
			   }
		 }			   
				
			   
		 
		// data<T,U> & operator[](int pos){ return datos.at(pos);}
		 
		 //const data<T,U> & operator[](int pos)const { return datos.at(pos);}
		 int size()const{
			   return data.size();
		 }
		 class const_iterator;
		 class iterator{
			   private:
				pair<t1,vector<t2> > * punt;
			   public:
				     iterator(){}
				     iterator & operator ++(){
					       punt++;
					       return *this;
				     }	       
				     iterator & operator --(){
					       punt--;
					       return *this;
				     }	       
				     bool operator ==(const iterator & it){
					       return it.punt==punt;
				     }
				     bool operator !=(const iterator & it){
					       return it.punt!=punt;
				     }
				     pair<t1,vector<t2> > & operator *(){
					       return *punt;
				     }
				     friend class Diccionario;
				     friend class const_iterator;
		 };
		 class const_iterator{
			   private:
				const pair<t1,vector<t2> > * punt;
			   public:
				     const_iterator(){}
				     const_iterator(const iterator &it){
					       punt = it.punt;
				     }	       
				     const_iterator & operator ++(){
					       punt++;
					       return *this;
				     }	       
				     const_iterator & operator --(){
					       punt--;
					       return *this;
				     }	       
				     bool operator ==(const const_iterator & it){
					       return it.punt==punt;
				     }
				     bool operator !=(const const_iterator & it){
					       return it.punt!=punt;
				     }
				     const pair<t1,vector<t2> > & operator *()const{
					       return *punt;
				     }
				     friend class Diccionario;
				     
		 };
		 iterator begin(){
			   iterator it;
			   it.punt = &(data[0]);
			   return it;
		 }
		 iterator end(){
			   iterator it;
			   it.punt = &(data[data.size()]);
			   return it;
		 }
		 
		 
		 const_iterator begin()const{
			   const_iterator it;
			   it.punt = &(data[0]);
			   return it;
		 }
		 const_iterator end()const {
			   const_iterator it;
			   it.punt = &(data[data.size()]);
			   return it;
		 }
		 
};
#endif
la duda es que el iterador es para iterar sobre la clase. pero la clase solo tiene un elemento. para que lo necesito?? en un iterador de una clase que contiene un vector itero sobre los elementos del vector. en la funcion begin devolveria el primer elemento de ese vector. pero si mi clase guia de telefono solo tiene un elemento, que se supone que tengo que devolver en la funcion begin?? tiene sentido hacer una clase iterator?? se supone que si porque me han pedido que la haga. no se si soy yo msmo que me estoy liando XDXD

creo que no me he explicado muy bien, espero que alguien me entienda jeje

gracias!!
  #2 (permalink)  
Antiguo 19/01/2013, 06:19
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 11 años, 10 meses
Puntos: 127
Respuesta: duda iteradores

El iterador es un elemento simbólico que devuelve una referencia a un elemento del vector. Se debe usar como elemento prototípico indistintamente de que el vector contenga un sólo elemento o dos trillones de elementos a recorrer. Si contiene un sólo elemento es una estupidez o no, depende de la disciplina que se tenga a la hora de programar.

Si te dijeron que usaras un iterador hazlo, no es tampoco muy difícil, es similar a un puntero hacia elementos de un array y puedes usar ++ ó -- para incrementar o decrementar (pre o post).

Supongo que mayor tontería que usar un iterador en un vector que sólo contendrá un elemento es crear un vector para almacenar un sólo elemento, con la carga a la CPU y la memoria que conlleva usar un objeto dinámico que sólo su instancia hace llamadas al alocator y otras muchas llamadas que en este caso no tendrán una finalidad práctica de almacenaje. Si sólo usarás un elemento usa una variable normal o en su defecto un array mediante [ y ].
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Etiquetas: funcion, int, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:57.