Excepto por la
std::vector<bool>
especialización parcial, los elementos se almacenan de forma contigua, lo que significa que los elementos pueden ser accedidos no solo a través de iteradores, sino también usando desplazamientos a punteros regulares a elementos. Esto significa que un puntero a un elemento de un vector puede ser pasado a cualquier función que espere un puntero a un elemento de un array.
El almacenamiento del vector se maneja automáticamente, expandiéndose según sea necesario. Los vectores normalmente ocupan más espacio que los arreglos estáticos, porque se asigna más memoria para manejar el crecimiento futuro. De esta manera, un vector no necesita realojarse cada vez que se inserta un elemento, sino solo cuando se agota la memoria adicional. La cantidad total de memoria asignada se puede consultar usando la función
capacity()
. La memoria adicional se puede devolver al sistema mediante una llamada a
shrink_to_fit()
[1]
.
Las reasignaciones suelen ser operaciones costosas en términos de rendimiento. La función
reserve()
puede utilizarse para eliminar reasignaciones si se conoce de antemano el número de elementos.
La complejidad (eficiencia) de las operaciones comunes en vectores es la siguiente:
Acceso aleatorio - constante
𝓞(1)
.
Inserción o eliminación de elementos al final - constante amortizado
𝓞(1)
.
Inserción o eliminación de elementos - lineal en la distancia al final del vector
𝓞(n)
.
Todas las funciones miembro de
std::vector
son
constexpr
: es posible crear y utilizar objetos
std::vector
en la evaluación de una expresión constante.
Sin embargo, los objetos
std::vector
generalmente no pueden ser
constexpr
, porque cualquier almacenamiento asignado dinámicamente debe liberarse en la misma evaluación de la expresión constante.
(desde C++20)
↑
En libstdc++,
shrink_to_fit()
no está
disponible
en modo C++98.
Los requisitos que se imponen a los elementos dependen de las operaciones reales realizadas en el contenedor. Generalmente, se requiere que el tipo de elemento sea un tipo completo y cumpla con los requisitos de
Erasable
, pero muchas funciones miembro imponen requisitos más estrictos.
(desde C++11)
(hasta C++17)
Los requisitos que se imponen a los elementos dependen de las operaciones reales realizadas en el contenedor. Generalmente, se requiere que el tipo de elemento cumpla con los requisitos de
Erasable
, pero muchas funciones miembro imponen requisitos más estrictos. Este contenedor (pero no sus miembros) puede instanciarse con un tipo de elemento incompleto si el asignador satisface los
requisitos de completitud del asignador
.
Un asignador que se utiliza para adquirir/liberar memoria y para construir/destruir los elementos en esa memoria. El tipo debe cumplir con los requisitos de
Allocator
.
El comportamiento es indefinido
(hasta C++20)
El programa está mal formado
(desde C++20)
si
Allocator::value_type
no es el mismo que
T
.
Especializaciones
La biblioteca estándar proporciona una especialización de
std::vector
para el tipo
bool
, que puede estar optimizada para eficiencia de espacio.
ranges::approximately_sized_range
,
ranges::reserve_hint
, y cambios en
std::vector
Ejemplo
Ejecutar este código
#include <iostream>#include <vector>int main(){// Crear un vector que contiene enteros
std::vector<int> v ={8, 4, 5, 9};// Añadir dos enteros más al vector
v.push_back(6);
v.push_back(9);// Sobrescribir elemento en posición 2
v[2]=-1;// Imprimir el vectorfor(int n : v)std::cout<< n <<' ';std::cout<<'\n';}
Salida:
8 4 -1 9 6 9
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.