std::lista en C++ con ejemplo

⚡ Resumen inteligente

std::lista en C++ Es un contenedor de secuencias implementado como una lista doblemente enlazada, lo que permite la inserción y eliminación rápidas en cualquier posición, al tiempo que almacena elementos en memoria no contigua y admite el acceso secuencial bidireccional en lugar del acceso aleatorio.

  • 🔗 Lista doblemente enlazada: Cada elemento mantiene vínculos con su nodo anterior y siguiente, por lo que los datos de std::list residen en memoria no contigua.
  • ⚡ Inserción y eliminación rápidas: Agregar o eliminar un elemento en una posición conocida requiere tiempo constante, a diferencia de un vector que desplaza elementos.
  • 🚫 Sin acceso aleatorio: Se accede a los elementos mediante un recorrido secuencial desde cualquiera de los extremos, por lo que no está disponible la indexación como list[3].
  • 🧩 Constructores: Los constructores Default, Fill, Range, Copy, Move y Initializer-List crean un std::list de diferentes maneras.
  • 🛠️ Funciones de los miembros: Las funciones push_front(), push_back(), insert(), erase(), size(), reverse() y merge() gestionan el contenido de la lista.
  • 🤖 Asistencia de IA: GitHub Copilot y asistentes similares generan automáticamente declaraciones de std::list, iteradores y lógica de inserción o borrado a partir de un comentario breve.

std::lista en C++

¿Qué es una std::list?

In C++`std::list` se refiere a un contenedor de almacenamiento. `std::list` permite insertar y eliminar elementos desde cualquier lugar. `std::list` se implementa como una lista doblemente enlazada. Esto significa que se puede acceder a los datos de la lista de forma bidireccional y secuencial.

La lista de la Biblioteca de Plantillas Estándar no admite acceso aleatorio rápido, pero sí admite acceso secuencial desde todas las direcciones.

Puede distribuir elementos de la lista en diferentes fragmentos de memoria. La información necesaria para el acceso secuencial a los datos se almacena en un contenedor. El std::list puede expandirse y reducirse desde ambos extremos según sea necesario durante el tiempo de ejecución. Un asignador interno cumple automáticamente los requisitos de almacenamiento.

Estas características plantean una pregunta práctica: ¿cuándo conviene recurrir a una lista?

¿Por qué utilizar std::list?

Estas son las razones para usar std::list:

  • El std::list funciona mejor en comparación con otros contenedores de secuencias como array y vector.
  • Tienen un mejor rendimiento al insertar, mover y extraer.tracelementos de cualquier posición.
  • El std::list también funciona mejor con algoritmos que realizan dichas operaciones de forma intensiva.

Una vez aclaradas las razones, el siguiente paso es la sintaxis que lo declara.

Sintaxis de lista

Para definir std::list, tenemos que importar el archivo de encabezado . Aquí está la sintaxis de definición de std::list:

template < class Type, class Alloc =allocator<T> > class list;

Aquí hay una descripción de los parámetros anteriores:

  • T – Define el tipo de elemento contenido. Puede sustituir T por cualquier tipo de dato, incluso tipos definidos por el usuario.
  • Alloc: define el tipo de objeto asignador. Por defecto, utiliza la plantilla de clase de asignador. Depende del valor y utiliza un modelo de asignación de memoria simple.

Ejemplo

#include <algorithm>
#include <iostream>
#include <list>
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };

	for (int x : my_list) {
		std::cout << x << '\n';
	}
}

Salida:

Salida del ejemplo de creación e iteración de std::list

Aquí hay una captura de pantalla del código:

C++ Código que crea una lista std::list y la imprime con un bucle for.

Code Explicación:

  1. Incluya el archivo de encabezado del algoritmo para utilizar sus funciones.
  2. Incluya el archivo de encabezado iostream para utilizar sus funciones.
  3. Incluya el archivo de encabezado de lista para utilizar sus funciones.
  4. Llame a la función principal(). La lógica del programa debe agregarse dentro del cuerpo de esta función.
  5. Cree una lista llamada my_list con un conjunto de 4 números enteros.
  6. Use un en bucle para crear una variable de bucle x. Esta variable se utilizará para iterar sobre los elementos de la lista.
  7. Imprima los valores de la lista en la consola.
  8. Fin del cuerpo del bucle for.
  9. Fin del cuerpo de la función main().

C++ Funciones de lista

Estas son las funciones std::list comunes:

Función Mareas Ideales para Lecciones
insertar() Esta función inserta un nuevo elemento antes de la posición que señala el iterador.
hacer retroceder() Esta función agrega un nuevo elemento al final de la lista.
empujar_front() Agrega un nuevo elemento al principio de la lista.
frente_pop() Elimina el primer elemento de la lista.
Talla() Esta función determina el número de elementos de la lista.
frente() Para determina los primeros elementos de la lista.
espalda() Para determina el último elemento de la lista.
contrarrestar () Invierte los elementos de la lista.
unir() Combina dos listas ordenadas.

Constructores

Aquí está la lista de funciones proporcionado por el archivo de encabezado :

  • Constructor predeterminado std::list::list()- Crea una lista vacía, es decir, con cero elementos.
  • Constructor de relleno std::list::list()- Crea una lista con n elementos y asigna un valor de cero (0) a cada elemento.
  • Constructor de rango std::list::list()- crea una lista con muchos elementos en el rango del primero al último.
  • Constructor de copia std::list::list()- Crea una lista con una copia de cada elemento contenido en la lista existente.
  • Constructor de movimientos std::list::list()- crea una lista con los elementos de otra lista usando la semántica de movimientos.
  • Constructor de lista inicializador std::list::list()-Crea una lista con los elementos de otra lista usando la semántica de movimiento.

Ejemplo

#include <iostream>
#include <list>
using namespace std;
int main(void) {
	list<int> l;
	list<int> l1 = { 10, 20, 30 };
	list<int> l2(l1.begin(), l1.end());
	list<int> l3(move(l1));  
	cout << "Size of list l: " << l.size() << endl;
	cout << "List l2 contents: " << endl;
	for (auto it = l2.begin(); it != l2.end(); ++it)
	      cout << *it << endl;
	cout << "List l3 contents: " << endl;
	for (auto it = l3.begin(); it != l3.end(); ++it)
		cout << *it << endl;
	return 0;
}

Salida:

Salida del ejemplo de constructores de std::list

Aquí hay una captura de pantalla del código:

C++ Código que muestra los constructores predeterminados, de rango y de movimiento de std::list.

Code Explicación:

  1. Incluya el archivo de encabezado iostream para utilizar sus funciones.
  2. Incluya el archivo de encabezado de lista para utilizar sus funciones.
  3. Incluya el espacio de nombres estándar en el código para usar sus clases sin llamarlo.
  4. Llame a la función principal(). La lógica del programa debe agregarse dentro del cuerpo de esta función.
  5. Crea una lista vacía llamada l.
  6. Crea una lista llamada l1 con un conjunto de 3 números enteros.
  7. Cree una lista llamada l2 con todos los elementos de la lista llamada l1, desde el principio hasta el final.
  8. Cree una lista llamada l3 usando la semántica de movimiento. La lista l3 tendrá el mismo contenido que la lista l2.
  9. Imprima el tamaño de la lista denominada l en la consola junto con otro texto.
  10. Imprime algo de texto en la consola.
  11. Cree un iterador llamado it y utilícelo para iterar sobre los elementos de la lista llamada l2.
  12. Imprime los elementos de la lista denominada l2 en la consola.
  13. Imprime algo de texto en la consola.
  14. Cree un iterador llamado it y utilícelo para iterar sobre los elementos de la lista llamada l3.
  15. Imprime los elementos de la lista denominada l3 en la consola.
  16. El programa debe devolver valor una vez completado con éxito.
  17. Fin del cuerpo de la función main().

Propiedades del contenedor

Aquí está la lista de propiedades del contenedor:

Propiedad Mareas Ideales para Lecciones
Secuencia Los contenedores de secuencia ordenan sus elementos en una secuencia lineal estricta. Se accede a los elementos por su posición en la secuencia.
Lista doblemente enlazada Cada elemento tiene información sobre cómo localizar los elementos anteriores y siguientes, lo que permite disponer de un tiempo constante para las operaciones de inserción y eliminación.
Consciente del asignador Un objeto asignador se utiliza para modificar dinámicamente el tamaño de almacenamiento.

Insertar en una lista

Existen diferentes funciones que podemos usar para insertar valores en una lista. Veamos cómo hacerlo:

Ejemplo

#include <algorithm>
#include <iostream>
#include <list>
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };
	my_list.push_front(11);
	my_list.push_back(18);
	auto it = std::find(my_list.begin(), my_list.end(), 10);
	if (it != my_list.end()) {
		my_list.insert(it, 21);
	}
	for (int x : my_list) {
		std::cout << x << '\n';
	}
}

Salida:

Salida después de insertar elementos en una lista std::list

Aquí hay una captura de pantalla del código:

C++ código que utiliza push_front, push_back e insert en una std::list

Code Explicación:

  1. Incluya el archivo de encabezado del algoritmo para utilizar sus funciones.
  2. Incluya el archivo de encabezado iostream para utilizar sus funciones.
  3. Incluya el archivo de encabezado de lista para utilizar sus funciones.
  4. Llame a la función principal(). La lógica del programa debe agregarse dentro del cuerpo de esta función.
  5. Cree una lista llamada my_list con un conjunto de 4 números enteros.
  6. Inserte el elemento 11 al frente de la lista denominada my_list.
  7. Inserte el elemento 18 al final de la lista denominada my_list.
  8. Cree un iterador y utilícelo para encontrar el elemento 10 de la lista my_list.
  9. Utilice una declaración if para determinar si se encontró o no el elemento anterior.
  10. Inserte el elemento 21 antes del elemento anterior si se encontró.
  11. Fin del cuerpo de la declaración if.
  12. Utilice un bucle for para crear una variable de bucle x. Esta variable se utilizará para iterar sobre los elementos de la lista.
  13. Imprima los valores de la lista en la consola.
  14. Fin del cuerpo del bucle for.
  15. Fin del cuerpo de la función main().

Los elementos que se incluyen en una lista se pueden eliminar con la misma facilidad.

Eliminar de una lista

Es posible eliminar elementos de una lista. La función erase() permite eliminar un elemento o un rango de elementos de una lista.

  • Para eliminar un solo elemento, simplemente pasa una posición entera. El elemento será eliminado.
  • Para eliminar un rango, se pasan los iteradores inicial y final. Veamos cómo hacerlo.

Ejemplo

#include <algorithm>
#include <iostream>
#include <list>
using namespace std;
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };
	cout << "List elements before deletion: ";
	for (int x : my_list) {
		std::cout << x << '\n';
	}
	list<int>::iterator i = my_list.begin();
	my_list.erase(i);
	cout << "\nList elements after deletion: ";
	for (int x : my_list) {
		std::cout << x << '\n';
	}
	return 0;
}

Salida:

Salida tras eliminar un elemento de una lista std::list

Aquí hay una captura de pantalla del código:

C++ código que utiliza la función erase en una std::list

Code Explicación:

  1. Incluya el archivo de encabezado del algoritmo para utilizar sus funciones.
  2. Incluya el archivo de encabezado iostream para utilizar sus funciones.
  3. Incluya el archivo de encabezado de lista para utilizar sus funciones.
  4. Incluya el espacio de nombres estándar en nuestro programa para usar sus clases sin llamarlo.
  5. Llame a la función principal(). La lógica del programa debe agregarse dentro del cuerpo de esta función.
  6. Cree una lista llamada my_list con un conjunto de 4 números enteros.
  7. Imprime algo de texto en la consola.
  8. Utilice un bucle for para crear una variable de bucle x. Esta variable se utilizará para iterar sobre los elementos de la lista.
  9. Imprima los valores de la lista en la consola.
  10. Fin del cuerpo del bucle for.
  11. Cree un iterador i que apunte al primer elemento de la lista.
  12. Utilice la función erase() señalada por el iterador i.
  13. Imprime algo de texto en la consola.
  14. Utilice un bucle for para crear una variable de bucle x. Esta variable se utilizará para iterar sobre los elementos de la lista.
  15. Imprima los valores de la lista en la consola. Esto viene después de la eliminación.
  16. Fin del cuerpo del bucle for.
  17. El programa debe devolver un valor al finalizar con éxito.
  18. Fin del cuerpo de la función main().

Preguntas Frecuentes

`std::vector` almacena elementos en memoria contigua con acceso aleatorio O(1), mientras que `std::list` es una lista doblemente enlazada que permite inserciones o eliminaciones en cualquier punto con una complejidad de O(1). Elija `vector` para la indexación y `list` para inserciones frecuentes en el medio.

No. std::list no tiene operador de acceso aleatorio, por lo que list[2] no compila. Se accede a un elemento iterando desde begin() o end() un nodo a la vez, lo que cuesta un tiempo lineal O(n) para una posición profunda.

std::list es una lista doblemente enlazada que recorre ambas direcciones y admite push_back. std::forward_list es una lista enlazada simple que solo avanza, usa menos memoria por nodo y no proporciona iteradores size() ni reverse.

Llama a la función miembro my_list.sort(), que se ejecuta en aproximadamente N log N y mantiene estables los elementos iguales. El algoritmo std::sort no funcionará porque necesita iteradores de acceso aleatorio. Pasa std::greater a sort() para obtener el orden descendente.

Insertar o eliminar un nodo tiene una complejidad temporal constante de O(1) una vez que se mantiene un iterador en la posición, ya que solo cambian los punteros vecinos. Encontrar esa posición primero mediante un recorrido sigue costando una complejidad temporal de O(n).

Sí. Una `std::list` no es un conjunto, por lo que almacena valores repetidos libremente. Cada `push_back`, `push_front` o `insert` agrega un nuevo nodo independientemente del contenido existente. Utilice `std::set` cuando necesite rechazar elementos duplicados.

Sí. Copiloto de GitHub Escribe declaraciones de `std::list`, bucles iteradores y llamadas a `inserte` o `erase` a partir de un comentario corto o el nombre de una función. A menudo sugiere `std::vector` cuando el almacenamiento contiguo se adapta mejor a la tarea.

Los asistentes de codificación basados ​​en IA autocompletan el código de los contenedores STL, señalan el uso incorrecto de iteradores, convierten una `std::list` a un `std::vector` y explican las ventajas y desventajas en cuanto a complejidad. Aceleran el aprendizaje de la STL, aunque cada sugerencia aún necesita revisión.

Resumir este post con: