Tengo una duda. De la función
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 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.