Código
la documentación dice:
iterator erase (iterator position);
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
Código
#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
Código
it2=l.erase(it2);
como lo mismo que...
Código
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
Código:
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