[C ++] - vector, cola, lista de contenedores STL

1. Clasificación STL

c ++ STL también se denomina biblioteca de plantillas estándar libaray de plantillas estándar.
A continuación se enumeran común en nuestro C ++ contenedor STL
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
destructor configuración de la embarcación, liberando el espacio de memoria abierta objeto está dispuesto por el asignador recipiente implementarse
asignar memoria abre responsable
dealocate responsable de liberar la memoria
de la construcción objeto constructo
destory el objeto Desestructuración

Segundo, vector

1. La estructura de datos subyacente
desarrollado dinámicamente, cada vez que la capacidad del vector vec se expande dos veces el tamaño del espacio original;
2. La interfaz relevante se
Inserte la descripción de la imagen aquí
incrementa:
vec.push_back (20); agregue elementos al final del contenedor, O (1) hace que el contenedor se expanda
vec.insert (it, 20); Agregue un elemento 20 O (n) en la posición señalada por el iterador, haciendo que el contenedor se expanda

Eliminar:
vec.pop_back (); eliminar el elemento O (1) al final
vec.erase (it); eliminar el elemento O (n) señalado por el iterador
Nota: la inserción o eliminación continua del contenedor (insertar / borrar) debe ser Actualice el iterador, de lo contrario se completa la primera inserción o borrado, el iterador no es válido

Ejemplo 1: Realice la eliminación de todos los números pares en el contenedor vec

int main()
{
vector<int> vec;
auto it2 = vec.begin();
	while (it2 != vec.end())
	{
		if (*it2 % 2 == 0)
		{

			it2 = vec.erase(it2);
		}
		else
		{
			++it2;
		}
	}
	return 0;
}

Si es solo vec.erase (it2); el iterador no será válido después de la ejecución, no se puede agregar it2. Por lo tanto, el iterador debe actualizarse una vez, y después de la eliminación, los siguientes elementos se mueven a la posición del iterador actual, por lo que no se usa 2 ++.
Además, el elemento actual continúa juzgando. Si el elemento actual no es par, los
resultados de la operación del iterador ++ son los siguientes:
Inserte la descripción de la imagen aquí
Ejemplo 2: Agregue un número par menor que 1 impar a todos los números impares en el contenedor del vector (inserción continua)

int main()
{
vector<int> vec;
auto it1 = vec.begin();
	for (it1 = vec.begin(); it1 != vec.end(); ++it1)
	{
		if (*it1 % 2 != 0)
		{
			it1=vec.insert(it1, *it1 - 1);//要对迭代器进行更新
			it1++;
		}
	}
	return 0;
}

Para actualizar el iterador: encuentre el número impar y realice dos operaciones ++, como se muestra en la figura a continuación, encuentre 47 e inserte 46 antes, ++ it1 inserte 46, it1 también debería ++ actualizar el iterador El siguiente número impar.Inserte la descripción de la imagen aquí

Consulta:
operador []; debido a que la capa inferior es una matriz, la característica más importante de la matriz es acceder aleatoriamente al
iterador vec [5] O (1) iterador para
encontrar a través del subíndice de la matriz , para_cada
foreach => a través del iterador para lograr

3. El
tamaño del método común (): devuelve el elemento de datos válido en la parte inferior del contenedor
vacío (): determina si el contenedor está vacío
reserve (20): el espacio de reserva para el vector solo abre el tamaño de espacio de memoria especificado para el fondo del contenedor y no agrega nuevos Cambio de
tamaño del elemento (20): la expansión del contenedor no solo abre un espacio de memoria de un tamaño especificado en la parte inferior del contenedor, sino que también agrega un nuevo
intercambio de elementos : dos contenedores intercambian elementos

Aquí, tenemos que hacer una distinción especial entre reservar y cambiar el tamaño.
La reserva es principalmente para reservar espacio para el contenedor de vectores, el siguiente código de verificación:

int main()
{
	vector<int> vec;//默认开辟的vector,底层空间为0
	vec.reserve(20);

	cout << vec.empty() << endl;//输出布尔值
	cout << vec.size() << endl;
	
	for (int i = 0; i < 20; i++)
	{
		vec.push_back(rand() % 100 + 1);
	}
	cout << vec.empty() << endl;
	cout << vec.size() << endl;
	return 0;
}

El resultado de la ejecución es el siguiente:
Inserte la descripción de la imagen aquí
por lo que podemos ver que la reserva reserva espacio para el contenedor vectorial 20 pero no hay datos en él, por lo que el vacío es verdadero y el proceso de adición no causará un aumento en la capacidad. Así que al final todavía tenía 20 capacidad.

Cambiar el tamaño es la expansión del contenedor, la siguiente verificación de código

int main()
{
	vector<int> vec;//默认开辟的vector,底层空间为0
	vec.resize(20);

	cout << vec.empty() << endl;//输出布尔值
	cout << vec.size() << endl;
	
	for (int i = 0; i < 20; i++)
	{
		vec.push_back(rand() % 100 + 1);
	}
	cout << vec.empty() << endl;
	cout << vec.size() << endl;
	return 0;
}

Los resultados de la operación son los siguientes:
Inserte la descripción de la imagen aquí
no solo se abren 20 espacios, sino que se almacenan 20 elementos plásticos con 0 y la expansión comienza cuando se
agregan 20 elementos adicionales, por lo que el vacío es falso. El proceso de adición agrega otros 20 elementos. Entonces el resultado final
es 40.4 Recorriendo el contenedor de vectores a través del iterador
Método 1:

auto it1 = vec.begin();
	for (; it1 != vec.end(); ++it1)
	{
		cout << *it1 << " ";
	}

Método 2:

int size = vec.size();
	for (int i = 0; i < size; i++)
	{
		cout << vec[i] << " ";
	}

Tres, cola y lista

1. Cola de contenedor de cola doble

1. La estructura de datos subyacente

La matriz bidimensional desarrollada dinámicamente, la matriz de un bit comienza en 2 y se expande 2 veces. Después de cada expansión, la matriz bidimensional original se almacena a partir del subíndice oldsize / 2 de la nueva matriz primera dimensión La misma línea en blanco está reservada para facilitar la adición de deque deq al primer y último elemento de deque;
como se muestra a continuación, cuando una cola está llena, entonces una cola se expande hacia abajo.
Inserte la descripción de la imagen aquí
Cuando ambas colas están llenas, luego expande
Inserte la descripción de la imagen aquí
2. Se
Inserte la descripción de la imagen aquí
agregan interfaces relacionadas :
deq.push_back (20); agregue el elemento O (1) desde el final
deq.push_front (20); agregue el elemento O (1) //vec.insert(vec.begin(),20) O (n)
deq. inserte (it, 20); agregue el elemento O (n) donde apunta

Eliminar:
deq.pop_back (); eliminar el elemento O (1) del final deq.pop_front (); eliminar el elemento O (1)
del encabezado
deq.erase (it); eliminar el elemento O (n) de la posición a la que apunta

Búsqueda de consultas:
iterador (la inserción y el borrado continuos deben tener en cuenta el problema del fallo del iterador)

2. Lista de contenedores de listas vinculadas

1. La estructura de datos subyacente La
lista enlazada circular bidireccional previa a los datos siguientes, como se muestra en la figura:
Inserte la descripción de la imagen aquí
2. Se
Inserte la descripción de la imagen aquí
agregan interfaces relacionadas :
mylist.push_back (20); agregue elementos desde el final O (1)
mylist.push_front (20); agregue elementos desde la cabeza O (1) //vec.insert(vec.begin(),20) O (n)
mylist.insert (it, 20); Agregue el elemento en la posición que apunta a O (1) Al insertar en la lista vinculada, primero debe Realizar una operación de consulta de consulta
Para listas vinculadas, la eficiencia de la operación de consulta es relativamente lenta

Eliminar:
mylist.pop_back (); eliminar el elemento O (1) del final
mylist.pop_front (); eliminar el elemento O (1)
mylist.erase (it) de la cabeza; eliminar el elemento O (n) de la posición a la que apunta

Búsqueda de consultas:
iterador (la inserción y el borrado continuos deben tener en cuenta el problema del fallo del iterador)

Elimine y enumere más que el contenedor de vectores, agregue y elimine interfaces de funciones:
push_front y pop_fornt

Cuatro, la diferencia entre vector, cola y lista

1. La diferencia entre vector y deque

Características del vector: matrices desarrolladas dinámicamente , la memoria es continua y la capacidad se expande en 2 veces el vector vec;

Características de reducción: espacio de matriz bidimensional desarrollado dinámicamente , la memoria inferior de extracción no es continua, la segunda dimensión es un espacio de matriz de longitud fija, cuando se expande (expansión doble de la matriz de primera dimensión)
1, la diferencia entre la estructura de datos subyacente
2 3. La complejidad temporal de insertar elementos antes, después, en el
medio y al final es la misma que O (1). La inserción de deque en frente es O (1) porque la cola de doble extremo se puede expandir antes o después, pero vectorO (n)

3. Para la eficiencia
del uso de la memoria, el espacio de memoria requerido por el vector debe ser continuo y la deque se puede dividir en bloques para el almacenamiento de datos. El espacio de memoria no necesita ser continuo.

4. Insertar o borrar en el medio, el vector de eficiencia es mejor y la eliminación es peor.
Aunque la complejidad del tiempo es O (n), es necesario considerar la conveniencia del movimiento. Dado que el espacio de memoria de la segunda dimensión de deque no es continuo, insertar o borrar el elemento en el medio de la deque hace que el elemento se mueva más lentamente que el vector.
Como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí
en segundo lugar, cada segunda dimensión es continua (renovada), que es continua por partes.
Se elimina un elemento, y el movimiento de los siguientes elementos se debe encontrar primero en una dimensión, se almacena la dirección de la posición inicial y luego se encuentra la posición de movimiento del elemento de acuerdo con el desplazamiento.
Sin embargo, la eliminación del vector es muy simple, como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí
debido a que su espacio de almacenamiento es continuo, se puede mover uno por uno en secuencia.

2. La diferencia entre vector y lista

La diferencia entre estos dos es similar a la diferencia entre una matriz y una lista vinculada, tal asociación hace que sea fácil obtener la respuesta

1. La estructura de datos subyacente
Una es una matriz dinámica y la otra es una lista enlazada doblemente circular

2. Agregar, eliminar y modificar la complejidad del tiempo

Aumento de matriz eliminar O (n) consulta O (n) acceso aleatorio O (1)
lista vinculada considerar el tiempo de búsqueda El resto de la complejidad del tiempo de eliminación de consulta es O (1)

Publicado 98 artículos originales · ganado elogios 9 · vistas 3659

Supongo que te gusta

Origin blog.csdn.net/qq_43412060/article/details/105266945
Recomendado
Clasificación