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 iteradoresfor (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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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ísticastd::liststd::vectorstd::deque
Estructura de memoriaMemoria no contigua, lista enlazada dobleMemoria contiguaMemoria contigua segmentada
Rendimiento de accesoAcceso secuencial rápido, acceso aleatorio lentoAcceso aleatorio rápidoAcceso rápido tanto al final como al inicio
Rendimiento de inserción/eliminaciónInserción y eliminación rápidas en cualquier posiciónInserción rápida al final, lenta en el medioInserción y eliminación rápidas al inicio y al final
Escenarios de aplicaciónInserciones/eliminaciones frecuentes en el medioNecesita acceso aleatorio eficienteNecesita inserción/eliminación rápida al inicio y al final
Estabilidad de los iteradoresEstable, la inserción o eliminación de elementos no invalida los iteradoresLa inserción o eliminación puede invalidar los iteradoresLa 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.

Otras extensiones