Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 98Fran en 8 Septiembre 2019, 11:12 am



Título: Problema con las Listas C++
Publicado por: 98Fran en 8 Septiembre 2019, 11:12 am
Estoy viendo Listas y no entiendo muy bien que estructura tiene que tener la lista.
He visto listas que usan el mismo método que las colas, luego que el usar el primer valor como inicio de la lista y los siguientes valores entran como si fueran una cola (pero el primer valor sigue teniendo la misma posición) o colas ordenadas por tamaño

Con colas ordenadas con tamaño me refiero a:
Cola normal: Nodo1 (Nodo1->Siguiente) ->Apunta a-> Nodo2(Nodo2->Siguiente) ->Apunta a-> Nodo3(Nodo3->Siguiente) ->Apunta a-> NULL


Cola ordenada por tamaño: Nodo1 (Nodo1->Siguiente) ->Apunta a-> Nodo3(Nodo3->Siguiente) ->Apunta a-> Nodo2(Nodo2->Siguiente) ->Apunta a-> NULL

siendo N1<N3<N2;

La conclusión que he llegado yo es que si no esta ordenado como una cola o una pila es una lista xD.

Se que de listas hay varios tipos como doblemente enlaza y circulares pero me refiero que cuando se hace una sucesión de nodos, sino es LIFO y no es FIFO ya se convierte automáticamente en una lista no?


Título: Re: Problema con las Listas C++
Publicado por: @XSStringManolo en 8 Septiembre 2019, 14:17 pm
https://es.cppreference.com/w/cpp/container/list

Una lista es un contenedor sin mas. No sé que tiene que ver ahí FIFO o LIFO. Es como decir que un string es FIFO o LIFO?
Tienes el unordered o el ordered list.

Para que no te comas la cabeza te diría que una lista es exactamente igual que un vector al que es mas rápido meterle y quitarle cosas. Pero más lento de recorrer por como se situa cada elemento de la lista en memoria. A parte tiene algunos métodos útiles para una lista que diría que el vector no tiene.

Te dejo los métodos que tiene:

Cita de: Metodos List
assign   asigna elementos a la lista
back   devuelve una referencia a el último componente de la lista
begin   devuelve un iterator al principio de la lista
clear   elimina todos los componentes de la lista
empty   true si la lista está vacía
end   devuelve un iterator al final de la lista
erase   elimina componentes de la lista
front   devuelve una referencia al primer componente de la lista
insert   inserta componentes en la lista
max_size   devuelve el número máximo de elementos soportados por la lista
merge   une dos listas
pop_back   elimina el último componente de la lista
pop_front   elimina el primer componente de la lista
push_back   añade un componente al final de la lista
push_front   añade un componente al frente de la lista
rbegin   devuelve un reverse_iterator hacia el final de la lista
remove   elimina componentes de la lista
remove_if   elimina condicionalmente componentes de la lista
rend   devuelve un reverse_iterator hacia el inicio de la lista
resize   cambia el tamaño de la lista
reverse   pone al revés los componentes de la lista
size   devuelve el número de componentes en la lista
sort   ordena la lista
splice   unión de dos listas
swap   intercambia el contenido de una lista con el de otra
unique   elimina componentes duplicados

A parte de los métodos se pueden usar algunos de los algoritmos y operadores que funcionan con otros elementos de la biblioteca de plantillas estandar(STL.)


Título: Re: Problema con las Listas C++
Publicado por: Beginner Web en 8 Septiembre 2019, 23:04 pm
Y sin olvidar que una lista ocupa el doble de tamaño en memoria que un arreglo convencional :')  ;-)


Título: Re: Problema con las Listas C++
Publicado por: RayR en 10 Septiembre 2019, 00:48 am
Una lista, como te dice string Manolo, es simplemente un contenedor, sin limitaciones de acceso a sus elementos. Te parecen similares a las colas porque comúnmente estructuras como colas y pilas se implementan internamente justamente con listas enlazadas, sólo que con restricciones en cuanto a dónde puedes insertar y tomar elementos, por lo que son más simples en ese sentido. Pero eso son detalles de su implementación y nada impide crear una cola usando alguna otra estructura interna, así que no hay que mezclar los conceptos.

Y sin olvidar que una lista ocupa el doble de tamaño en memoria que un arreglo convencional :')  ;-)

Bueno, no necesariamente. Una lista enlazada simple le añade a cada elemento 4 u 8 bytes (el tamaño de un puntero). Si los elementos de la lista son, digamos, structs, y ocupan 32 bytes, entonces una lista ocupará un 12.5 o 25% más que si se usara un arreglo.