vectors push_back example espaƱol c++ stdvector

push_back - vector insert c++



std:: dynarray vs std:: vector (2)

Entonces, ¿cuáles son los beneficios y el uso de std::dynarray , cuando podemos usar std::vector que es más dinámico (re-considerable)?

dynarray es más pequeño y más simple que el vector , ya que no necesita administrar valores de capacidad y tamaño por separado, y no necesita almacenar un asignador.

Sin embargo, se pretende que el principal beneficio de rendimiento provenga del hecho de que se alienta a las implementaciones a asignar dynarray en la pila cuando sea posible, evitando cualquier asignación de pila. p.ej

std::dynarray<int> d(5); // can use stack memory for elements auto p = new std::dynarray<int>(6); // must use heap memory for elements

Esta optimización requiere la cooperación del compilador, no se puede implementar como un tipo de biblioteca pura, y la magia del compilador necesaria no se ha implementado y nadie está seguro de lo fácil que es hacer. Debido a la falta de experiencia en la implementación, en la reunión del comité de C ++ en Chicago la semana pasada se decidió extraer std::dynarray de C ++ 14 y emitir un documento adicional de extensiones de matriz TS (especificación técnica) definiendo std::experimental::dynarray y matrices de runtime bound (ARBs, similar a C99 VLAs). Esto significa que std::dynarray casi seguro que no estará en C ++ 14.

C ++ 14 presenta std::dynarray :

std :: dynarray es un contenedor de secuencia que encapsula matrices con un tamaño que se fija en la construcción y no cambia a lo largo de la vida útil del objeto.

std::dynarray debe asignarse en tiempo de ejecución de la misma manera que std::vector .

Entonces, ¿cuáles son los beneficios y el uso de std::dynarray mientras que podemos usar std::vector que es más dinámico (y también re-considerable)?


Como dijo usted mismo, std::dynarray es para una matriz dinámica de tamaño fijo . No es redimensionable En términos generales, es una mejora con respecto a la new T[N] y sobre std::unique_ptr<T[]>(new T[N]) .

No necesitar cambiar el tamaño ni administrar la capacidad significa que puede implementar la estructura de datos con menos complejidad y en menos espacio.

Además, std::dynarray es un animal raro que permite que la implementación lo implemente de diferentes maneras, no específicas, por ejemplo, es posible poner la matriz en la pila. Llamar a una función de asignación es "opcional". Puede especificar un asignador para construir los elementos de la matriz, pero eso no es parte del tipo.

También podría preguntarse por qué necesitamos std::dynarray y arrays de longitud variable. Los VLA en C ++ 14 son mucho más restrictivos; solo pueden ser variables automáticas locales y no ofrecen ninguna forma de especificar una política de asignación y, por supuesto, no tienen una interfaz de contenedor estándar.

Algunos ejemplos de 23.3.4.2 de un "borrador actual" (toma eso, caché de Google):

explicit dynarray(size_type c);

Efectos: asigna almacenamiento para elementos c . Puede o no invocar al operator new global operator new .

template <class Alloc> dynarray(size_type c, const Alloc& alloc);

Efectos: Equivalente a los constructores precedentes, excepto que cada elemento se construye con una construcción de uso-asignador .

Si se puede usar un asignador determinado para construir los elementos de la matriz es un rasgo global:

plantilla struct uses_allocator, Alloc>: true_type {};

Requiere: Alloc será un Asignador (17.6.3.5). [ Nota: la especialización de este rasgo informa a otros componentes de la biblioteca que dynarray se puede construir con un asignador, incluso si no tiene un allocator_type anidado.]

Editar: La respuesta de Jonathan Wakely seguramente será mucho más autorizada y perspicaz.