logo

Lista de reenvío en C++ STL

lista_adelante El contenedor proporciona la implementación de lista enlazada individualmente estructura de datos. Almacena datos en una memoria no contigua donde cada elemento apunta al siguiente elemento de la secuencia. Esto hace que la inserción y eliminación sean más rápidas una vez que se conoce la posición del elemento.

Sintaxis

La lista de avance se define como std::lista_adelante plantilla de clase dentro del< lista_adelante > archivo de encabezado.



lista_adelanteFlorida;

dónde

conversión de tipos y conversión en java
  • T: Tipo de datos de elementos en la lista de reenvío.
  • F: Nombre asignado a la lista de reenvíos.

Declaración e inicialización

Una forward_list se puede declarar e inicializar de varias maneras, como se muestra en el siguiente ejemplo:



C++
#include    using namespace std; void printFL(forward_list<int>& fl) {  for (auto i : fl)  cout << i << ' ';  cout << 'n'; } int main() {    // Creating an empty forward_list  forward_list<int> fl1;  // Creating a forward_list with  // default value  forward_list<int> fl2(3 4);    // Creating a forward_list from an  // initializer list  forward_list<int> fl3 = {1 5 3 4};    printFL(fl2);  printFL(fl3);  return 0; } 

Producción
4 4 4 1 5 3 4 

Ejemplo: En el programa anterior, inicializamos simplemente la lista de reenvío de tres maneras:

  • Declaración lista_adelante FL1 crea una lista directa vacía de números enteros.
  • Declaración lista_adelante fl2(34) crea una lista directa de tamaño 3 y con cada elemento 4.
  • Declaración lista_adelante fl3 = {1 5 3 4} crea una lista directa y se inicializa con los elementos de la lista de inicializadores.

Operaciones básicas

Estas son las operaciones básicas que podemos realizar en una lista directa:

1. Accediendo a los elementos

No se puede acceder a los elementos de la lista directa mediante índices como matrices o vectores. Tenemos que recorrer la lista de forma secuencial desde el inicio hasta la posición deseada para acceder a ella. Esto se puede hacer incrementando comenzar() iterador pero es mejor usarlo próximo() o avance() función.



Sin embargo, se puede acceder fácilmente al primer elemento de la lista mediante frente() método.

Ejemplo:

C++
#include    using namespace std; int main() {  forward_list<int> fl = {1 5 3 4};  // Access the first element  cout << fl.front() << endl;    // Access third element  auto it = next(fl.begin() 2);  cout << *it;  return 0; } 

Producción
1 3

Ejemplo: En el programa anterior, el primer elemento se imprime usando frente() método. Para acceder al tercer elemento próximo() se utiliza para mover el iterador dos posiciones desde el principio y *él se utiliza para desreferenciar el iterador.

año en trimestres

2. Insertar elementos

Los elementos se pueden insertar en la lista de reenvío usando insertar_después() función. Requiere el iterador después del cual se insertará el elemento. Sin embargo, la inserción rápida en la parte delantera se ve favorecida por empujar_front() método.

Ejemplo:

C++
#include    using namespace std; int main() {  forward_list<int> fl = {5 4};  // Inserting Element at front  fl.push_front(1);    // Insert 3 after the second element  auto it = fl.begin();  advance(it 1);  fl.insert_after(it 3);    for (auto x: fl) cout << x << ' ';  return 0; } 

Producción
1 5 3 4 

Explicación: En este programa, el primer elemento de forward_list se inserta al frente usando el empujar_front() función. Luego se crea un iterador y se mueve una posición hacia adelante usando el avance() función. Después de eso el elemento 5 se inserta después del segundo elemento usando el insertar_después() función.

3. Actualización de elementos

El valor de los elementos existentes se puede cambiar simplemente accediendo a ellos y usando operador de asignación para asignar el nuevo valor.

Ejemplo:

C++
#include    using namespace std; int main() {  forward_list<int> fl = {1 5 3 4};  // Updating first element  fl.front() = 111;  cout << fl.front() << endl;    // Updating third element  auto it = next(fl.begin() 2);  *it = 333;  cout << *it;  return 0; } 

Producción
111 333

4. Encontrar elemento

La lista directa no proporciona ninguna función miembro para buscar un elemento, pero podemos usar la encontrar() algoritmo para encontrar cualquier valor dado.

Ejemplo :

C++
#include    using namespace std; int main() {  forward_list<int> fl = {1 5 3 4};  // Finding 3  auto it = find(fl.begin() fl.end() 3);    if (it != fl.end()) cout << *it;  else cout << 'Element not Found';  return 0; } 

Producción
3

5. Atravesando

Se puede recorrer una lista de reenvío usando comenzar() y fin() iteradores con un bucle pero solo podemos avanzar y no retroceder.

Ejemplo:

C++
#include    using namespace std; int main() {  forward_list<int> fl = {1 5 3 4};    // Traversing using range-based for loop  for(auto i : fl)  cout << i << ' ';  cout << endl;    return 0; } 

Producción
1 5 3 4 

6. Eliminar elementos

En la lista directa podemos eliminar el elemento en la posición dada usando borrar_después() método. Este método lleva el iterador a una posición antes del elemento de destino. La eliminación rápida desde el frente es posible usando pop_front() método.

cadena en métodos java

Ejemplo:

C++
#include    using namespace std; int main() {  forward_list<int> fl = {1 5 3 4};  // Delete first element  fl.pop_front();    // Delete third element  auto it = fl.begin();  advance(it 1);  fl.erase_after(it);    for (auto x: fl) cout << x << ' ';  return 0; } 

Producción
5 3 

7. Tamaño de la lista de reenvíos

forward_list no tiene una función size() incorporada. Para encontrar su tamaño necesitamos contar manualmente los elementos atravesándolos con un bucle o usando std:: distancia.

C++
#include    #include  #include    using namespace std; int main() {  forward_list<int> flist={10203040};  //Calculate size by counting elements using std:: distance  int size=distance(flist.begin()flist.end());  cout<<'Size of forward_list: '<<size<<endl;  return 0; } 

Producción
Size of forward_list: 4 

8. vacío()

Se utiliza para comprobar si forward_list está vacío.
Devuelve verdadero si la lista está vacía y falso en caso contrario, lo que permite verificar rápidamente si el contenedor no tiene datos.

C++
#include    #include  using namespace std; int main() {  forward_list<int> flist;  if (flist.empty()) {  cout << 'The forward_list is empty.' << endl;  }  flist.push_front(10);  if (!flist.empty()) {  cout << 'The forward_list is not empty.' << endl;  }  return 0; } 

Producción
The forward_list is empty. The forward_list is not empty. 

Complejidad del tiempo

La siguiente tabla enumera la complejidad temporal de las operaciones anteriores en la lista directa:

Operación Complejidad del tiempo
Acceder al primer elemento O(1)
acceso sustantivo, masculino—thelemento En)
Insertar en el frente O(1)
Insertar después de una posición específica En)
Eliminar el primer elemento O(1)
Eliminar después de una posición específica En)
transversal En)

Lista de reenvío vs lista

Característica

lista_adelante

lista

Tipo de lista enlazada

lista enlazada individualmente

lista doblemente enlazada

transversal

Sólo puede avanzar

formato.fecha.formato

Puede atravesar tanto hacia adelante como hacia atrás.

Uso de memoria

Utiliza menos memoria (solo un puntero por nodo)

Utiliza más memoria (dos punteros por nodo)

Inserción/Eliminación

Inserción y eliminación rápidas, pero solo en o después de una posición determinada

Inserción y eliminación rápida en cualquier lugar (antes o después de una posición)

Funciones soportadas

Limitado en comparación con la lista (sin tamaño() sin iteradores inversos)

Interfaz más completa que incluye iteradores bidireccionales size() reverse().



chanclas