std::list::erase <list>

Iniciado por dijsktra, 4 Julio 2018, 12:07 PM

0 Miembros y 1 Visitante están viendo este tema.

dijsktra

Tengo una duda. De la función
Código (cpp) [Seleccionar]
iterator erase (iterator position);
la documentación dice:

RETURNS : An iterator pointing to the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.

Mi pregunta es: se deve asumir algún valor "util" en el iterador, como parametro de entrada salida?

El siguiente programa invierte el sugsegmento L[i..i+k) del vector corresponidente a la lista L[0..N), con 0 <=i < N , 0 <= k

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

// P : length(l) >= 0 , 0 <= i < length(l)  ,k >= 0
void invertSegment(list<char>& l, const int i, const int k){
 list<char>::const_iterator it1,it2;
 it1 = next(l.begin(),i);  //O(l)
 it2 = next(l.begin(),min(i+k,(int)l.size())); // O(i+k)
 for(it2--;it2!=it1 ;it2-- ) // O(k))
   {
     l.insert(it1,*it2);  // O(1)
     it2=l.erase(it2);
   }
 return;    
}



int main() {
 list<char> l;
 int N, i, k;
 char c;
 for ( ; cin >> N >> i >> k; )
   {
     l.clear();
     for (int n = 0; n < N; n++)
{
cin >> c ; l.push_back(c);
}
     invertSegment(l,i,k);
     for (list<char>::const_iterator it=l.begin(); it!=l.end(); it++) cout << *it << " ";
     cout << endl;
   }
 return true;
}


En la linea 14, debo asumir

it2=l.erase(it2);

como lo mismo que...

l.erase(it2);

Yo creo que NO, pese a que el programa parce funcionar.

Aquí algunas salidas: La primera linea leem, N, i, k , la segunda la lista de N elementos y la salida marca la lista con la sublista invertida
6 1 2
1 2 3 4 5 6
1 3 2 4 5 6
6 1 4
1 2 3 4 5 6
1 5 4 3 2 6
6 1 5
1 2 3 4 5 6
1 6 5 4 3 2
6 0 6
1 2 3 4 5 6
6 5 4 3 2 1


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

ivancea96

Si no pusieras el it2 = ..., it2 dejaría de ser un itrador válido.
Al hacer la asignación, it2 es el siguiente en la lista. Dado que luego se le hace el "--", vuelve para atrás (dado que se eliminó el antiguo it2, es lo mismo que haber hecho "it2--" antes del erase).

Asi que una de 2, o haces la asignación del erase, o te guardas un iterador al elemento anterior.