2

std::map如果自定义比较器在重新平衡期间抛出异常怎么办?显然,它应该记住所有先前的回合并将所有内容恢复到原始状态。这是真的吗?

4

1 回答 1

1

参见 [associative.reqmts.except]:

对于关联容器,没有clear()函数抛出异常。除非容器的对象(如果有)erase(k)抛出异常,否则不会抛出异常。Compare

insert对于关联容器,如果插入单个元素的或函数中的任何操作引发异常emplace,则插入无效。

对于关联容器,没有swap函数抛出异常,除非该异常是由容器Compare对象的交换(如果有)抛出的。

所以你基本上是对的(在单个元素插入的情况下),但这并不意味着容器必须“记住所有先前的转折”才能“将所有内容恢复到其原始状态”。假设关联容器是使用自平衡二叉搜索树实现的(我不确定是否还有其他可能性),比较只是为了沿着树向下查找必须插入新节点的位置. 如果在此过程中通过异常退出比较,则树还没有被修改,所以容器所要做的就是释放它此时为新元素分配的内存(如果有的话)。随后的重新平衡步骤不会产生异常,

于 2021-02-19T19:28:50.083 回答