为何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
相关产品推荐
相关产品推荐

