clear函数的时间复杂度是std :: map?
我是否正确地说它是O(1)?
答案 0 :(得分:3)
标准说明在 [associative.reqmts] / 8 表102 :
中的
a.clear()
< =>a.erase(a.begin(), a.end())
a.size()
线性
所以实际上它被命令为O(N)。
编辑:总结各个位。
要删除节点,map
执行两项操作:
destroy
方法来销毁元素deallocate
方法以释放节点占用的内存前者可以在代码中省略(检查is_trivially_destructible
),实际上它通常在vector
中完成。不幸的是,后者更加棘手,并且不存在特征,因此我们必须依赖优化器。
不幸的是,即使通过内联优化器可以完全删除destroy
和deallocate
节点,我担心它无法实现树遍历现在无用并优化 也离开了。因此,您最终会在树的Θ(N)遍历中结束,并且在每一步都没有完成......
答案 1 :(得分:2)
cplusplus reference site声称它在容器的大小上具有线性复杂性,因为必须调用每个元素的析构函数。
答案 2 :(得分:2)
因为它是一个模板,所以在编译时可能会知道类型的无操作中的销毁(例如std::map<int>
),因此销毁成员的需要不是推断必要性的良好基础最糟糕的表现。仍然,编译器必须访问二叉树的每个节点,释放堆内存,并且节点的数量线性地与元素的数量相关(erase()
仅使迭代器/引用/指向已擦除元素的指针无效,{ {1}}不会使所有证据与1:1关系无效。
所以,它是线性的,但是由于需要清理堆使用,即使不需要元素析构函数......
(有趣的是,这意味着一个insert()
- 类似的关联容器 - 或者可能是std::map<>
本身带有一个聪明的自定义分配器 - 可以为具有普通无操作析构函数的元素设置O(1)所有内存都是从专用内存池中分配的,可以在O(1)中“丢弃”。)
答案 3 :(得分:0)
据我所知,所有清理操作的复杂性都是O(n),因为你需要逐个去除这些对象。