clear函数is std::map的时间复杂度是多少?
我说它是O(1)对吗?
发布于 2012-06-12 09:44:45
该标准在associative.reqmts/8表102中说
a.clear()
<=>a.erase(a.begin(), a.end())
linear ina.size()
因此,它实际上被强制为O(N)。
编辑:总结了各种比特。
要删除节点,map
需要执行两个操作:
destroy
方法销毁元素deallocate
方法释放节点占用的内存
前者可以在代码中省略(检查is_trivially_destructible
),实际上它通常是在vector
中完成的。不幸的是,后者更棘手,而且不存在特征,所以我们必须依赖于优化器。
不幸的是,即使通过内联优化器可以完全删除destroy
和deallocate
节点,我担心它也无法意识到树遍历现在是无用的,也无法对其进行优化。因此,您最终将在树的Θ(N)遍历中结束,并且在每一步都不执行任何操作...
发布于 2012-06-12 09:30:02
cplusplus reference site声称它在容器大小方面具有线性复杂性,因为必须调用每个元素的析构函数。
发布于 2012-06-12 09:38:12
因为它是一个模板,所以在编译时可能知道类型的无操作销毁(例如std::map<int>
),所以销毁成员的需要并不是推断必要的最坏情况性能的良好基础。尽管如此,编译器必须访问二叉树的每个节点,释放堆内存,并且节点的数量与元素的数量成线性关系( erase()
只会使指向被擦除元素的迭代器/引用/指针无效,insert()
不会使任何其他元素无效等所有证据都是1:1关系的证据)。
因此,它是线性的,但因为即使不需要元素析构函数,也需要清理堆的使用。
(有趣的是,这意味着如果所有内存都是从一个专用内存池中分配的,那么对于带有简单的无操作析构函数的元素,可以将std::map<>
-like关联容器--或者可能是使用智能的自定义分配器的std::map<>
本身--设为O(1)。)
https://stackoverflow.com/questions/10993830
复制相似问题