elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Como intercambiar valores de un iterator en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Como intercambiar valores de un iterator en C++  (Leído 4,396 veces)
alpachino98

Desconectado Desconectado

Mensajes: 37


Valar Morghulis


Ver Perfil
Re: Como intercambiar valores de un iterator en C++
« Respuesta #10 en: 20 Enero 2019, 18:19 pm »

Paso el codigo por un enlace de mega. Siento mucho el estado del codigo, hay mucho comentario pero es por los intentos. El problema se encuentra en la clase Agenda, todos los demas metodos funcionan bien excepto <ordenaListas()>

Citar


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Como intercambiar valores de un iterator en C++
« Respuesta #11 en: 20 Enero 2019, 18:26 pm »

El problema era que olvidé los paréntesis. (++it1)--.
Prueba a ver si funciona y me cuentas. Suerte :-X


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
alpachino98

Desconectado Desconectado

Mensajes: 37


Valar Morghulis


Ver Perfil
Re: Como intercambiar valores de un iterator en C++
« Respuesta #12 en: 20 Enero 2019, 18:50 pm »

Justo, mil gracias!!

Dejo el código para intercambiar iteradores y ordenar con iteradores una lista alfabeticamente por si le sirve a alguien.

Código:
void Agenda::ordenaListas(){
    Contacto auxiliar;
    for(list<Contacto>::iterator it1 = listapal.begin(); it1 != --listapal.end(); it1++)
        for(list<Contacto>::iterator it2 = (++it1)--; it2 != listapal.end(); it2++)
            if(it1->comparar(it2->getNombre()))
{
                auxiliar = *it1;
                *it1 = *it2;
                *it2 = auxiliar;
            }
}

Código:
bool Contacto::comparar(const string& s)
{
int i=0;
while (i<nombre.length()||i<s.length())
if(nombre[i]!=','&& s[i]!=',')
if(nombre[i]!='\0'&&s[i]!='\0')
{

if(s[i]<nombre[i])
return true;
if(s[i]==nombre[i])
i++;
else
return false;
}
}
« Última modificación: 24 Enero 2019, 01:52 am por alpachino98 » En línea

Loretz

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: Como intercambiar valores de un iterator en C++
« Respuesta #13 en: 21 Enero 2019, 19:16 pm »

En C++11 también puedes usar el miembro sort de una std::list; hay varias formas, creo que la más usual es:

1) Defines el criterio de ordenación:
Código:
struct Orden {
    bool operator() (const Contacto& c1, const Contacto& c2)
    {
        return c1.nombre < c2.nombre;
    }
};
2) Lo usas en sort:
Citar
Agenda.sort(Orden());
En línea

dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Como intercambiar valores de un iterator en C++
« Respuesta #14 en: 22 Enero 2019, 16:02 pm »

Justo, mil gracias!!

Dejo el código para intercambiar iteradores y ordenar con iteradores una lista alfabeticamente por si le sirve a alguien.

Código:
void Agenda::ordenaListas(){
    Contacto auxiliar;
    for(list<Contacto>::iterator it1 = listapal.begin(); it1 != --listapal.end(); it1++)
        for(list<Contacto>::iterator it2 = (++it1)--; it2 != listapal.end(); it2++)
            if(it1->comparar(it2->getNombre()))
{
                auxiliar = *it1;
                *it1 = *it2;
                *it2 = auxiliar;
            }
}
...
Más simple  (y más C++). Usa el operador ">" de strings, los operadores next(),begin() de iterator, y swap!!
Código
  1. #include <string>
  2. #include <utility> //swap
  3. #include <list> //list
  4.  
  5. using namespace std;
  6. ...
  7. // BubleSort
  8. // P : listapal=A[0..N) N>=0
  9. // Q : \forall i : 0 <= i < N-1: V[i] < V[i+1] and permut(listapal,A,N)
  10. void  Agenda::ordenaListas()
  11. {
  12.  list<Contacto>::iterator it1, it2;
  13.  for( it1 = listapal.begin(); it1 != prev(listapal.end()); it1++)
  14.    for(it2 = next(it1); it2 != listapal.end(); it2++)
  15.      if (it1->getNombre() > it2->getNombre()) swap(*it1,*it2);
  16. }
  17.  
No puedo mandar resultados porque no tengo el resto de los componentes, (Contacto, Agenda)...
 Fijaos que es una traducción del clasico en pseudocodigo.
En algún sitio he leído que hay que tener cuidado con usar el operador "<" en iteradores!. Tiene que estar definido por el programador del iterador!
Código
  1. for (i=0; i<n-1; i++)
  2.   for (j=i+1; j<n; j++)
  3.    if(V[i]>V[j])
  4.       V[i],V[j]=V[j],V[i]; // Esto no existe en C
  5.  



« Última modificación: 23 Enero 2019, 10:14 am por dijsktra » En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines