from - vector c++
std:: vector<int>:: claro, ¿tiempo constante? (2)
Posible duplicado:
¿Cuál es la complejidad de std :: vector <T> :: clear () cuando T es un tipo primitivo?
Si tengo un std::vector
con un tipo primitivo, y llamo clear()
(de esta manera push_back
comienza al comienzo de la capacity
), ¿la llamada clear()
se completará en tiempo constante o tiempo lineal? La documentación dice que destruye todos los elementos, pero si el elemento es un int, no debería haber nada que destruir, ¿no?
editar: Encontré un duplicado que tiene un póster que explica en detalle que la implementación puede verificar si el destructor es trivial, y da un ejemplo de un compilador que tiene esa verificación (GCC).
¿Cuál es la complejidad de std :: vector <T> :: clear () cuando T es un tipo primitivo?
Depende de cómo se implemente el vector, pero un conjunto de objetos con destructores triviales (que incluye POD como tipos integrales integrados como int
) debería poder desasignarse de forma segura con una única llamada al vector<T>::allocator_type::deallocate
sin hacer bucles sobre los elementos e invocar destructores de forma individual. Una implementación de std::vector
puede usar type_traits
o compiladores internos para determinar si T
tiene un destructor trivial, y desasignar la matriz interna en consecuencia. Necesitará verificar el código fuente de su implementación para averiguar qué hace, pero la mayoría de las implementaciones std::vector
de std::vector
le dará la asignación de tiempo constante para tipos con destructores triviales (o al menos tiempo constante para tipos integrales y otros POD).
El estándar no garantiza la complejidad de std::vector::clear
, aunque se espera que la operación sea lineal en el tamaño del contenedor para tipos de elementos complejos y constante para los POD.