elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  std::list::erase <list>
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: std::list::erase <list>  (Leído 1,642 veces)
dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
std::list::erase <list>
« 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



« Última modificación: 4 Julio 2018, 12:12 pm por dijsktra » En línea

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


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: std::list::erase <list>
« Respuesta #1 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.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
help con list
Programación Visual Basic
dark_soul 3 1,620 Último mensaje 18 Septiembre 2006, 17:57 pm
por SheKeL_C$
de un txt a un list
Programación Visual Basic
sp26 9 2,826 Último mensaje 21 Noviembre 2006, 15:51 pm
por ranslsad
List :S wtf!!!
Programación Visual Basic
schumacher 3 1,818 Último mensaje 29 Diciembre 2007, 15:41 pm
por schumacher
Duda con List.list en programa
Programación Visual Basic
b_rabbit10 2 1,953 Último mensaje 17 Septiembre 2012, 04:47 am
por b_rabbit10
Mostrar List al pulsar en un elemento de otra List en AWT
Java
kikian94 4 2,193 Último mensaje 28 Marzo 2015, 17:33 pm
por Usuario Invitado
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines