std::vector的复杂性是什么<;T>;::当T是基元类型时清除()?
我知道clear()操作的复杂性与容器的大小成线性关系,因为必须调用析构函数。但是基本类型(和POD)呢?看起来最好的办法是将向量大小设置为0,这样复杂性是恒定的std::vector的复杂性是什么<;T>;::当T是基元类型时清除()?,vector,complexity-theory,unordered-map,primitive,Vector,Complexity Theory,Unordered Map,Primitive,我知道clear()操作的复杂性与容器的大小成线性关系,因为必须调用析构函数。但是基本类型(和POD)呢?看起来最好的办法是将向量大小设置为0,这样复杂性是恒定的 如果这是可能的,std::unordered_map也有可能吗?gcc版本的std::_Destroy,这是clear()最终使用的,它尝试模板化类型是否具有平凡的析构函数,因此在这种情况下,即使没有优化过程,复杂性也是恒定的。然而,我不知道模板的工作情况如何 看起来最好的办法是将向量大小设置为0,这样复杂性是恒定的 通常,的复杂性与
如果这是可能的,std::unordered_map也有可能吗?gcc版本的
std::_Destroy
,这是clear()
最终使用的,它尝试模板化类型是否具有平凡的析构函数,因此在这种情况下,即使没有优化过程,复杂性也是恒定的。然而,我不知道模板的工作情况如何
看起来最好的办法是将向量大小设置为0,这样复杂性是恒定的
通常,的复杂性与当前存储在向量中的元素数成线性关系。因此,将vector
的大小设置为零与调用clear()
相比没有任何优势-两者基本相同
但是,至少有一个实现(libstdc++,中的source)通过采用部分模板专门化为基本类型提供了O(1)复杂性
clear()
的实现导航到中的std::\u Destroy(from,to)
函数,该函数执行一个非平凡的编译时优化:它使用类型为bool
的模板参数声明一个辅助模板类\u Destroy\u aux
。该类对true
进行了部分专门化,对false
进行了显式专门化。这两个专门化都定义了一个名为\uu destroy
的静态函数。如果模板参数为true
,则函数体为空;如果参数为false
,则可以通过调用std::_Destroy(ptr)
诀窍在于:
std::\u Destroy\u aux::
__销毁(先销毁,后销毁);
辅助类是基于\uuuu has\uu triple\u析构函数检查的结果实例化的。对于内置类型,检查程序返回true
,对于具有非平凡析构函数的类型,检查程序返回false
。因此,对\uu destroy
的调用对于int
、double
和其他POD类型来说是不可操作的
std::unordered_map
与vector
不同,它可能需要删除表示POD对象“散列桶”的结构,而不是删除对象本身*。将clear
优化为O(1)
是可能的,但这在很大程度上取决于实现,因此我不会指望它
*确切答案取决于实现:基于开放寻址(线性探测、二次探测等)实现的哈希表可能能够删除O(1)
中的所有存储桶;然而,基于单独链接的实现必须逐个删除bucket。对于resize
?@Quimby是的,这是否是真的。clear重用向下调整向量大小的逻辑。好的,谢谢!:)
std::_Destroy_aux<__has_trivial_destructor(_Value_type)>::
__destroy(__first, __last);