std::list
es un contenedor que permite la inserción y eliminación de elementos en tiempo constante desde cualquier posición del contenedor. No admite acceso aleatorio rápido. Normalmente se implementa como una lista doblemente enlazada. En comparación con
std::forward_list
este contenedor proporciona capacidad de iteración bidireccional aunque es menos eficiente en cuanto al uso de espacio.
Agregar, eliminar y mover elementos dentro de la lista o a través de varias listas no invalida los iteradores o referencias. Un iterador se invalida solo cuando se elimina el elemento correspondiente.
Todas las funciones miembro de
std::list
son
constexpr
: es posible crear y utilizar objetos
std::list
en la evaluación de una expresión constante.
Sin embargo, los objetos
std::list
generalmente no pueden ser
constexpr
, porque cualquier almacenamiento asignado dinámicamente debe liberarse en la misma evaluación de la expresión constante.
Los requisitos que se imponen sobre los elementos dependen de las operaciones reales realizadas en el contenedor. Generalmente, se requiere que el tipo de elemento sea un tipo completo y cumpla con los requisitos de
Erasable
, pero muchas funciones miembro imponen requisitos más estrictos.
(desde C++11)
(hasta C++17)
Los requisitos que se imponen sobre los elementos dependen de las operaciones reales realizadas en el contenedor. Generalmente, se requiere que el tipo de elemento cumpla con los requisitos de
Erasable
, pero muchas funciones miembro imponen requisitos más estrictos. Este contenedor (pero no sus miembros) puede instanciarse con un tipo de elemento incompleto si el asignador satisface los
requisitos de completitud del asignador
.
Un asignador que se utiliza para adquirir/liberar memoria y para construir/destruir los elementos en esa memoria. El tipo debe cumplir con los requisitos de
Allocator
.
El comportamiento es indefinido
(hasta C++20)
El programa está mal formado
(desde C++20)
si
Allocator::value_type
no es el mismo que
T
.
Tipos miembro
Tipo miembro
Definición
value_type
T
allocator_type
Allocator
size_type
tipo entero sin signo (normalmente std::size_t)
difference_type
tipo entero con signo (normalmente std::ptrdiff_t)
#include <algorithm>#include <iostream>#include <list>int main(){// Crear una lista que contenga enteros
std::list<int> l ={7, 5, 16, 8};// Agregar un entero al frente de la lista
l.push_front(25);// Agregar un entero al final de la lista
l.push_back(13);// Insertar un entero antes del 16 mediante búsquedaauto it =std::find(l.begin(), l.end(), 16);if(it != l.end())
l.insert(it, 42);// Imprimir la listastd::cout<<"l = { ";for(int n : l)std::cout<< n <<", ";std::cout<<"};\n";}
Salida:
l = { 25, 7, 5, 42, 16, 8, 13, };
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.