You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何std::deque与std::unordered_map复杂度计算未遵循同一标准规则?

关于C++容器复杂度标准的疑问

背景:std::deque的push_back/push_front复杂度争议

我曾查阅gcc 13537号bug报告,其中提到std::deque的push_back、push_front操作实际是分摊O(1)(amortized O(1))而非单纯O(1)。讨论结论指出,deque的指针映射重分配(复杂度O(n))未被计入这两个操作的复杂度,依据是C++标准条款[container.requirements.general]/2:所有复杂度要求仅以对包含对象的操作次数衡量,而移动指针不属于对deque包含对象的操作。

对std::unordered_map的困惑

基于上述逻辑,我产生了疑问:为何同一标准不适用于std::unordered_map::rehash?
最坏情况下,std::unordered_map的所有元素哈希值相同,会被放入同一个桶中。若桶以单链表实现,向链表尾部追加元素需遍历所有元素,总复杂度将达O(n²)。但遍历链表并不涉及对unordered_map包含对象的操作,按前述逻辑,插入操作应为O(1),整体复杂度应是O(n)。

这令我十分困惑:要么deque的复杂度应标注为分摊O(1),要么rehash的最坏情况复杂度应为O(n),或许是我理解有误?

补充困惑

阅读相关评论后,我更困惑:为何插入操作需要遍历桶?


内容的提问来源于stack exchange,提问作者klezki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:47:17