C ++ STL: lista de avance de contenedores secuenciales

1. Información general

forward_list es un nuevo tipo de contenedor agregado por C++ 11. Su implementación subyacente es la misma que la del contenedor de listas y también usa una estructura de lista vinculada, excepto que forward_list usa una lista vinculada única, mientras que la lista usa una lista doblemente vinculada. . Como se muestra abajo:

inserte la descripción de la imagen aquí

En la figura anterior, H representa el encabezado de la lista vinculada. a) representa una lista simplemente enlazada, b) representa una lista doblemente enlazada. No es difícil ver que la característica más importante del uso de una lista vinculada para almacenar datos es que no almacena los datos de forma centralizada (como una matriz), en otras palabras, la ubicación de almacenamiento de los datos en la lista vinculada está dispersa y aleatorio y los datos en toda la lista vinculada Las relaciones lineales se mantienen mediante punteros. Por lo tanto, el contenedor forward_list tiene las mismas características que el contenedor de lista, es decir, es bueno para insertar o eliminar elementos en cualquier posición de la secuencia, pero no es tan eficiente como otros contenedores (como matrices y vectores) para acceder. elementos almacenados.

Además, dado que la lista enlazada individualmente no es tan flexible como la lista doblemente enlazada, la función del contenedor forward_list está muy limitada en comparación con el contenedor de listas. Por ejemplo, dado que una lista enlazada individualmente solo se puede atravesar de adelante hacia atrás y no admite el recorrido inverso, el contenedor forward_list solo proporciona iteradores directos, no iteradores bidireccionales. Esto significa que el contenedor forward_list no tiene funciones miembro como rbegin(), rend().

Entonces, dado que el contenedor forward_list tiene las mismas características que el contenedor de lista, y el contenedor de lista puede proporcionar más funciones, ¿por qué es necesario el contenedor forward_list? Por supuesto, la capa inferior del contenedor forward_list utiliza una lista enlazada individualmente, lo cual no es inútil. Por ejemplo, para almacenar la misma cantidad de elementos del mismo tipo, la lista enlazada individualmente consume menos espacio de memoria, tiene una mayor utilización del espacio y es más eficiente al implementar ciertas operaciones en la lista enlazada individualmente.

La alta eficiencia es la razón principal para elegir forward_list en lugar del contenedor de lista. En otras palabras, siempre que la operación pueda realizarse tanto con el contenedor de lista como con el contenedor de lista forward, se debe preferir el contenedor de lista forward.

2. Funciones de los miembros

función miembro Función
antes_comenzar() Devuelve un iterador directo que apunta a la posición anterior al primer elemento del contenedor.
comenzar() Devuelve un iterador directo que apunta a la posición del primer elemento en el contenedor.
fin() Devuelve un iterador directo que apunta a la posición más allá del último elemento del contenedor.
cbefore_begin() Tiene la misma función que before_begin(), excepto que el atributo constante se agrega encima y no se puede usar para modificar elementos.
comenzar() Tiene la misma función que comenzar (), excepto que el atributo constante se agrega encima y no se puede usar para modificar elementos.
algunos() Tiene la misma función que end(), excepto que el atributo constante se agrega encima y no se puede usar para modificar elementos.
vacío() Determine si hay un elemento en el contenedor; si no hay ningún elemento, devuelva verdadero; de lo contrario, devuelva falso.
tamaño máximo() Devuelve el número máximo de elementos que puede contener el contenedor. Suele ser un valor grande, como 2^32-1, por lo que rara vez utilizamos esta función.
frente() Devuelve una referencia al primer elemento.
asignar() Reemplaza el contenido original del contenedor con un nuevo elemento.
empujar_front() Inserta un elemento en la cabecera del contenedor.
emplace_front() Genera un elemento en la cabecera del contenedor. Esta función tiene la misma función que push_front(), pero es más eficiente.
pop_front() Elimina un elemento en la cabecera del contenedor.
emplazar_después() Inserta un nuevo elemento después de la posición especificada y devuelve un iterador que apunta al nuevo elemento. Misma función que insert_after(), pero más eficiente.
insertar_después() Inserta un nuevo elemento después de la posición especificada y devuelve un iterador que apunta al nuevo elemento.
borrar_después() Elimina todos los elementos dentro de una posición o rango especificado en el contenedor.
intercambio() Para intercambiar elementos en dos contenedores, debes asegurarte de que los tipos de elementos almacenados en los dos contenedores sean los mismos.
cambiar tamaño() Ajusta el tamaño del contenedor.
claro() Elimina todos los elementos almacenados por el contenedor.
empalme_después() Inserta el elemento en la posición o rango especificado en un contenedor forward_list después de la posición especificada en otro contenedor.
eliminar(valor) Elimina todos los elementos iguales a val en el contenedor.
eliminar_si() Retire los elementos del contenedor que cumplan la condición.
único() Elimine los elementos duplicados adyacentes en el contenedor, dejando solo uno.
unir() Combine dos contenedores forward_list que se hayan ordenado de antemano y el contenedor forward_list fusionado todavía estará en orden.
clasificar() Ordena los elementos en el contenedor cambiando sus posiciones.
contrarrestar() Invierte el orden de los elementos en el contenedor.

Además, la biblioteca estándar de C++ 11 también agrega dos funciones, comenzar () y finalizar (), que son diferentes de las funciones miembro comenzar () y finalizar () contenidas en el contenedor forward_list. El objeto de operación puede ser un contenedor o una matriz ordinaria. Cuando el objeto de operación es un contenedor, tiene la misma función que las funciones miembro comenzar() y finalizar() contenidas en el contenedor; si el objeto de operación es una matriz ordinaria, la función comenzar() devuelve un puntero al primer elemento. de la matriz, de manera similar end() devuelve un puntero a una posición después del último elemento de la matriz (tenga en cuenta que no es el último elemento).

El contenedor forward_list también tiene una std::swap(x , y)función que no es miembro (donde x e y son contenedores forward_list que almacenan elementos del mismo tipo), que tiene exactamente la misma función que la función miembro swap(), con solo una diferencia en la sintaxis de uso.

El siguiente ejemplo demuestra el uso de algunas funciones miembro:

#include <iostream>
#include <forward_list>
using namespace std;

int main()
{
    std::forward_list<int> values{1,2,3};
    values.emplace_front(4); // {4,1,2,3}
    values.emplace_after(values.before_begin(), 5); // {5,4,1,2,3}
    values.reverse(); // {3,2,1,4,5}
    for (auto it = values.begin(); it != values.end(); ++it) {
        cout << *it << " ";
    }
    return 0;
}

El resultado de la operación es:

3 2 1 4 5

Funciones relacionadas con el uso de contenedores forward_list

Sabemos que la función size() no se proporciona en el contenedor forward_list, pero si desea obtener la cantidad de elementos almacenados en el contenedor forward_list, puede usar la función distancia() en el archivo de encabezado <iterador>. Por ejemplo:

#include <iostream>
#include <forward_list>
#include <iterator>
using namespace std;

int main()
{
    std::forward_list<int> my_words{1,2,3,4};
    int count = std::distance(std::begin(my_words), std::end(my_words));
    cout << count;
    return 0;
}

El resultado de la operación es:

4

Además, el movimiento del iterador del contenedor forward_list ++puede usar la función advanced() además de usar el operador para moverse en un solo paso, por ejemplo:

#include <iostream>
#include <forward_list>
using namespace std;

int main()
{
    std::forward_list<int> values{1,2,3,4};
    auto it = values.begin();
    advance(it, 2);
    while (it!=values.end())
    {
        cout << *it << " ";
        ++it;
    }
    return 0;
}

El resultado de la operación es:

3 4

3. Creación del contenedor forward_list

Dado que el contenedor forward_list se incluye en el archivo de encabezado <forward_list> en forma de clase de plantilla forward_list<T> (T es el tipo de elemento de almacenamiento) y se define en el espacio de nombres estándar. Por lo tanto, antes de utilizar el contenedor, el código debe incluir las dos líneas de código siguientes:

#include <forward_list>
using namespace std;

El espacio de nombres estándar también se puede especificar cuando se utiliza el contenedor forward_list, de cualquier manera.

Hay aproximadamente 5 formas de crear un contenedor forward_list.

  1. Cree un contenedor forward_list vacío sin ningún elemento:
std::forward_list<int> values;

Esta es una forma común de crear contenedores forward_list, ya que también se les pueden agregar elementos después de su creación.

  1. Cree un contenedor forward_list con n elementos:
std::forward_list<int> values(10);

Cree un contenedor de valores de esta manera, que contenga 10 elementos, y el valor de cada elemento es el valor predeterminado del tipo correspondiente (el valor predeterminado del tipo int es 0).

  1. Crea un contenedor forward_list que contiene n elementos, especificando un valor inicial para cada elemento. Por ejemplo:
std::forward_list<int> values(10, 5);

Esto crea un contenedor de valores con 10 elementos cada uno con un valor de 5.

  1. En el caso de un contenedor forward_list existente, se puede crear un nuevo contenedor forward_list copiando este contenedor. Por ejemplo:
std::forward_list<int> value1(10);
std::forward_list<int> value2(value1);

Tenga en cuenta que de esta manera, es necesario garantizar que los tipos de elementos almacenados en los contenedores nuevos y antiguos sean consistentes.

  1. Se puede crear un nuevo contenedor forward_list copiando elementos en un área específica en otros tipos de contenedores (o matrices ordinarias). Por ejemplo:
// 拷贝普通数组,创建forward_list容器
int a[] = { 1,2,3,4,5 };
std::forward_list<int> values(a, a+5);
// 拷贝其它类型的容器,创建forward_list容器
std::array<int, 5> arr{ 11,12,13,14,15 };
std::forward_list<int> values(arr.begin()+2, arr.end()); // 拷贝arr容器中的{13,14,15}

Supongo que te gusta

Origin blog.csdn.net/crossoverpptx/article/details/131679192
Recomendado
Clasificación