Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: dijsktra en 4 Julio 2018, 12:07 pm



Título: std::list::erase <list>
Publicado por: dijsktra en 4 Julio 2018, 12:07 pm
Tengo una duda. De la función
Código
  1. 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

Código
  1. #include <iostream>
  2. #include <list>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. // P : length(l) >= 0 , 0 <= i < length(l)  ,k >= 0
  7. void invertSegment(list<char>& l, const int i, const int k){
  8.  list<char>::const_iterator it1,it2;
  9.  it1 = next(l.begin(),i);  //O(l)
  10.  it2 = next(l.begin(),min(i+k,(int)l.size())); // O(i+k)
  11.  for(it2--;it2!=it1 ;it2-- ) // O(k))
  12.    {
  13.      l.insert(it1,*it2);  // O(1)
  14.      it2=l.erase(it2);
  15.    }
  16.  return;    
  17. }
  18.  
  19.  
  20.  
  21. int main() {
  22.  list<char> l;
  23.  int N, i, k;
  24.  char c;
  25.  for ( ; cin >> N >> i >> k; )
  26.    {
  27.      l.clear();
  28.      for (int n = 0; n < N; n++)
  29. {
  30. cin >> c ; l.push_back(c);
  31. }
  32.      invertSegment(l,i,k);
  33.      for (list<char>::const_iterator it=l.begin(); it!=l.end(); it++) cout << *it << " ";
  34.      cout << endl;
  35.    }
  36.  return true;
  37. }
  38.  

En la linea 14, debo asumir

Código
  1. it2=l.erase(it2);

como lo mismo que...

Código
  1. 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



Título: Re: std::list::erase <list>
Publicado por: ivancea96 en 4 Julio 2018, 20:03 pm
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.