Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
std::vector的复杂性是什么<;T>;::当T是基元类型时清除()?_Vector_Complexity Theory_Unordered Map_Primitive - Fatal编程技术网

std::vector的复杂性是什么<;T>;::当T是基元类型时清除()?

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,这样复杂性是恒定的 通常,的复杂性与

我知道clear()操作的复杂性与容器的大小成线性关系,因为必须调用析构函数。但是基本类型(和POD)呢?看起来最好的办法是将向量大小设置为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);