El mecanismo de expansión del vector c ++

1. Al hacer retroceder un elemento al vector, si el número de elementos excede la capacidad del vector en este momento, se activará la expansión

2. El proceso de expansión es: abrir un nuevo espacio -> copiar los elementos del antiguo espacio -> liberar el antiguo espacio

3. El tamaño del nuevo espacio abierto durante el proceso de expansión afecta la eficiencia de insertar elementos en el vector:

  • Si el tamaño del nuevo espacio es el tamaño del antiguo espacio + 1, es decir, la capacidad se expande mientras se inserta, por lo que se debe copiar cada inserción, y la complejidad del tiempo es O(n), lo cual es muy ineficiente
  • Si el nuevo tamaño de espacio es el tamaño de espacio anterior + k, entonces la complejidad de tiempo promedio de push_back un elemento sigue siendo O(n). Calculado de la siguiente manera:

  •  Si el tamaño del nuevo espacio es m veces el tamaño del antiguo espacio, la complejidad de tiempo promedio de hacer retroceder un elemento es O(1), y la eficiencia mejora considerablemente. Calculado de la siguiente manera:

  •  Generalmente m toma 1.5 o 2. Cuando el valor es 1.5, la memoria previamente liberada se puede reutilizar durante cada expansión, mientras que cuando el valor es 2, la memoria previamente liberada no se puede reutilizar durante la expansión de capacidad.La explicación es la siguiente:

  • ¿Por qué m no toma 3 o 4 o más? Porque si el múltiplo excede 2 veces (incluyendo 2 veces), existirá la expansión: ① El desperdicio de espacio puede ser relativamente alto, por ejemplo: después de la expansión, se solicitan 64 espacios, pero solo se almacenan 33 elementos y casi la mitad del espacio no se usa ②No se puede utilizar la memoria liberada anteriormente.

4. Resumen

  • La multiplicación del vector en push_back puede lograr una complejidad de evento O(1) después de la amortización, que es mejor que la complejidad temporal O(n) de aumentar el tamaño especificado.
  • Para evitar el desperdicio de la memoria de la aplicación, los métodos de crecimiento de 2 veces y 1,5 veces se usan comúnmente ahora, y el método de crecimiento de 1,5 veces puede realizar mejor la reutilización de la memoria.

5. El tamaño(), la capacidad(), el cambio de tamaño() y la reserva() del vector

size devuelve el número de elementos en el vector

capacidad devuelve la capacidad del vector (capacidad>=tamaño)

resize modifica el tamaño. Si el tamaño n especificado por resize es más pequeño que el tamaño actual, los elementos adicionales se eliminarán; si n es más grande que el tamaño y más pequeño que la capacidad actual, se insertarán los valores de elementos predeterminados de n-size ; si n es mayor que la capacidad, la capacidad se expandirá.

reserve modifica el tamaño de la capacidad, si el tamaño especificado n es menor o igual a la capacidad actual, no se hará nada; si n es mayor que la capacidad, la capacidad se ampliará a n

6, referencia

Pregunta de la entrevista: ¿Por qué la expansión dinámica del vector C++ es 1,5 veces o 2 veces?

Mecanismo de expansión vectorial de STL: se busca programador 

おすすめ

転載: blog.csdn.net/qq_41021141/article/details/131329403