Como intercambiar valores de un iterator en C++

Iniciado por alpachino98, 20 Enero 2019, 01:28 AM

0 Miembros y 2 Visitantes están viendo este tema.

alpachino98

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()>

Citarhttps://mega.nz/#!V19hjQbQ!JsclFGwKgG1TKwaoY5e6UdJw2d7MihIuUvjYUxSFJW0

K-YreX

El problema era que olvidé los paréntesis. (++it1)--.
Prueba a ver si funciona y me cuentas. Suerte :-X
Código (cpp) [Seleccionar]

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

alpachino98

#12
Justo, mil gracias!!

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

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;
           }
}


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;
}
}

Loretz

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:
struct Orden {
    bool operator() (const Contacto& c1, const Contacto& c2)
    {
        return c1.nombre < c2.nombre;
    }
};

2) Lo usas en sort:
CitarAgenda.sort(Orden());

dijsktra

#14
Cita de: alpachino98 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.

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 (cpp) [Seleccionar]

#include <string>
#include <utility> //swap
#include <list> //list

using namespace std;
...
// BubleSort
// P : listapal=A[0..N) N>=0
// Q : \forall i : 0 <= i < N-1: V[i] < V[i+1] and permut(listapal,A,N)
void  Agenda::ordenaListas()
{
 list<Contacto>::iterator it1, it2;
 for( it1 = listapal.begin(); it1 != prev(listapal.end()); it1++)
   for(it2 = next(it1); it2 != listapal.end(); it2++)
     if (it1->getNombre() > it2->getNombre()) swap(*it1,*it2);
}

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!
for (i=0; i<n-1; i++)
  for (j=i+1; j<n; j++)
   if(V[i]>V[j])
      V[i],V[j]=V[j],V[i]; // Esto no existe en C




Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)