std::vector
es una clase de plantilla que encapsula una matriz dinámica 1 , almacenada en el montón, que crece y se reduce automáticamente si se agregan o eliminan elementos. Proporciona todos los ganchos ( begin()
, end()
iteradores, etc.) que hacen que funcione bien con el resto del STL. También tiene varios métodos útiles que le permiten realizar operaciones que en una matriz normal serían engorrosas, como, por ejemplo, insertar elementos en el medio de un vector (maneja todo el trabajo de mover los siguientes elementos detrás de escena).
Como almacena los elementos en la memoria asignada en el montón, tiene algo de sobrecarga con respecto a las matrices estáticas.
std::array
es una clase de plantilla que encapsula una matriz de tamaño estático, almacenada dentro del propio objeto, lo que significa que, si crea una instancia de la clase en la pila, la matriz misma estará en la pila. Su tamaño debe conocerse en el momento de la compilación (se pasa como un parámetro de plantilla) y no puede crecer ni reducirse.
Es más limitado que std::vector
, pero a menudo es más eficiente, especialmente para tamaños pequeños, porque en la práctica es principalmente un envoltorio liviano alrededor de una matriz de estilo C. Sin embargo, es más seguro, ya que la conversión implícita a puntero está deshabilitada, y proporciona gran parte de la funcionalidad relacionada con STL de std::vector
y de los otros contenedores, por lo que puede usarla fácilmente con algoritmos STL & co. De todos modos, por la limitación del tamaño fijo, es mucho menos flexible que std::vector
.
Para una introducción a std::array
, eche un vistazo a este artículo ; para una introducción rápida a std::vector
las operaciones que son posibles en él, puede consultar su documentación .
En realidad, creo que en el estándar se describen en términos de máxima complejidad de las diferentes operaciones (por ejemplo, acceso aleatorio en tiempo constante, iteración sobre todos los elementos en tiempo lineal, adición y eliminación de elementos al final en tiempo amortizado constante, etc.), pero AFAIK no hay otro método para cumplir tales requisitos que no sea el uso de una matriz dinámica. Según lo indicado por @Lucretiel, el estándar realmente requiere que los elementos se almacenen contiguamente, por lo que es una matriz dinámica, almacenada donde el asignador asociado lo coloca.
std::vector
vs.std::array
y cómo los términos son diferentes.