Clase de contenedor de C++<list>
La biblioteca estándar de C++ ofrece una gran cantidad de funciones, entre las cuales<list>es una clase de contenedor muy importante, utilizada para almacenar colecciones de elementos y admite iteradores bidireccionales.
<list>es un contenedor secuencial en la Biblioteca de Plantillas Estándar (STL) de C++, que permite insertar y eliminar elementos rápidamente en cualquier posición del contenedor. A diferencia de los arreglos o vectores (<vector>),<list>no necesita especificar un tamaño al crearse, y puede agregar o eliminar elementos en cualquier posición sin reasignar memoria.
Sintaxis
A continuación se presentan<list>algunas operaciones básicas del contenedor:
- Incluir el archivo de cabecera:
#include <list> - Declarar la lista:
std::list<T> mylist;, dondeTes el tipo de elemento almacenado en la lista. - Insertar elemento:
mylist.push_back(value); - Eliminar elemento:
mylist.pop_back();omylist.erase(iterator); - Acceder a un elemento:
mylist.front();ymylist.back(); - Recorrer la lista: usar iteradores
for (auto it = mylist.begin(); it != mylist.end(); ++it)
Características
- Iteración bidireccional:
<list>Proporciona iteradores bidireccionales, lo que permite recorrer los elementos hacia adelante y hacia atrás. - Tamaño dinámico: a diferencia de los arreglos,
<list>el tamaño de <list> puede cambiar dinámicamente, sin necesidad de preasignar una memoria de tamaño fijo. - Inserción y eliminación rápidas: permite insertar o eliminar elementos rápidamente en cualquier posición de la lista, sin necesidad de mover una gran cantidad de elementos como en el vector.
Declaración e inicialización
<list>La declaración e inicialización de <list> es similar a la de otros contenedores:
#include <iostream>
#include <list>
int main() {
std::list<int> lst1; // 空的list
std::list<int> lst2(5); // 包含5个默认初始化元素的list
std::list<int> lst3(5, 10); // 包含5个元素,每个元素为10
std::list<int> lst4 = {1, 2, 3, 4}; // 使用初始化列表
return 0;
}
Ejemplo
A continuación se muestra un<list>ejemplo simple de uso de <list>, que incluye crear la lista, agregar elementos, recorrerla y mostrar los resultados.
Ejemplo
#include <list>
int main() {
// Crear una lista de tipo entero
std::list<int> numbers;
// Agregar elementos a la lista
numbers.push_back(10);
numbers.push_back(20);
numbers.push_back(30);
// Acceder e imprimir el primer elemento de la lista
std::cout << "First element: " << numbers.front() << std::endl;
// Acceder e imprimir el último elemento de la lista
std::cout << "Last element: " << numbers.back() << std::endl;
// Recorrer la lista e imprimir todos los elementos
std::cout << "List elements: ";
for (std::list<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// Eliminar el último elemento de la lista
numbers.pop_back();
// Recorrer nuevamente la lista e imprimir todos los elementos
std::cout << "List elements after removing the last element: ";
for (std::list<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
Salida:
First element: 10 Last element: 30 List elements: 10 20 30 List elements after removing the last element: 10 20
Funciones miembro comunes
A continuación se presentan<list>algunas funciones miembro comunes de <list>:
| Función | Descripción |
|---|---|
push_back(const T& val) |
Agrega un elemento al final de la lista enlazada |
push_front(const T& val) |
Agrega un elemento al inicio de la lista enlazada |
pop_back() |
Elimina el elemento del final de la lista enlazada |
pop_front() |
Elimina el elemento del inicio de la lista enlazada |
insert(iterator pos, val) |
Inserta un elemento en la posición especificada |
erase(iterator pos) |
Elimina el elemento en la posición especificada |
clear() |
Vacía todos los elementos |
size() |
Devuelve el número de elementos de la lista enlazada |
empty() |
Comprueba si la lista enlazada está vacía |
front() |
Devuelve el primer elemento de la lista enlazada |
back() |
Devuelve el último elemento de la lista enlazada |
remove(const T& val) |
Elimina todos los elementos iguales al valor especificado |
sort() |
Ordena los elementos de la lista enlazada |
merge(list& other) |
Fusiona otra lista enlazada ya ordenada |
reverse() |
Invierte la lista enlazada |
begin() / end() |
Devuelve el iterador de inicio/fin de la lista enlazada |
Ejemplo
1. Operaciones básicas
Ejemplo
#include <list>
int main() {
std::list<int> lst = {10, 20, 30};
// Insertar y eliminar elementos
lst.push_front(5); // Insertar 5 al inicio
lst.push_back(40); // Insertar 40 al final
lst.pop_front(); // Eliminar el elemento del inicio
lst.pop_back(); // Eliminar el elemento del final
// Mostrar el contenido de la lista enlazada
std::cout << "List elements: ";
for (const auto& elem : lst) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
2. Insertar y eliminar elementos en posiciones específicas
Ejemplo
#include <list>
int main() {
std::list<int> lst = {1, 2, 3, 4, 5};
auto it = lst.begin();
std::advance(it, 2); // Mover el iterador al tercer elemento (valor 3)
lst.insert(it, 10); // Insertar 10 antes del tercer elemento
lst.erase(it); // Eliminar el tercer elemento
// Mostrar el contenido de la lista enlazada
std::cout << "List elements: ";
for (const auto& elem : lst) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
3. Ordenar y eliminar duplicados
Ejemplo
#include <list>
int main() {
std::list<int> lst = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
lst.sort(); // Ordenar
lst.unique(); // Eliminar los elementos duplicados adyacentes
// Mostrar el contenido de la lista enlazada
std::cout << "Sorted and unique list: ";
for (const auto& elem : lst) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
4. Fusionar e invertir
Ejemplo
#include <list>
int main() {
std::list<int> lst1 = {1, 3, 5, 7};
std::list<int> lst2 = {2, 4, 6, 8};
lst1.merge(lst2); // Fusionar dos listas enlazadas ordenadas
lst1.reverse(); // Invertir la lista enlazada
// Mostrar el contenido de la lista enlazada
std::cout << "Merged and reversed list: ";
for (const auto& elem : lst1) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
Comparación con otros contenedores
| Característica | std::list | std::vector | std::deque |
|---|---|---|---|
| Estructura de memoria | Memoria no contigua, lista enlazada doble | Memoria contigua | Memoria contigua segmentada |
| Rendimiento de acceso | Acceso secuencial rápido, acceso aleatorio lento | Acceso aleatorio rápido | Acceso rápido tanto al final como al inicio |
| Rendimiento de inserción/eliminación | Inserción y eliminación rápidas en cualquier posición | Inserción rápida al final, lenta en el medio | Inserción y eliminación rápidas al inicio y al final |
| Escenarios de aplicación | Inserciones/eliminaciones frecuentes en el medio | Necesita acceso aleatorio eficiente | Necesita inserción/eliminación rápida al inicio y al final |
| Estabilidad de los iteradores | Estable, la inserción o eliminación de elementos no invalida los iteradores | La inserción o eliminación puede invalidar los iteradores | La inserción o eliminación puede invalidar los iteradores |
Precauciones
<list>Los elementos de <list> se almacenan en el orden de inserción, no ordenados por su valor.- Dado que
<list>los elementos de <list> se almacenan en diferentes posiciones de memoria, no es adecuado para escenarios que requieren acceso aleatorio. - En comparación con el vector,
<list>la eficiencia de uso de memoria de <list> es menor, porque cada elemento necesita espacio adicional para almacenar punteros a los elementos anterior y siguiente.
A través de esta introducción y ejemplos simples, los principiantes deberían poder<list>tener un conocimiento básico del contenedor <list> de C++ y comenzar a usarlo para resolver problemas prácticos.