使用自定义比较器 std::map 异常安全吗?

Is std::map exception safe with custom comparator?

如果自定义比较器在重新平衡期间抛出异常,std::map 会做什么?显然,它应该记住所有之前的回合,并且 return 一切都回到原来的状态。是真的吗?

参见[associative.reqmts.except]:

For associative containers, no clear() function throws an exception. erase(k) does not throw an exception unless that exception is thrown by the container’s Compare object (if any).

For associative containers, if an exception is thrown by any operation from within an insert or emplace function inserting a single element, the insertion has no effect.

For associative containers, no swap function throws an exception unless that exception is thrown by the swap of the container’s Compare object (if any).

所以你基本上是对的(在单个元素插入的情况下),但这并不意味着容器必须“记住所有以前的轮次”才能“return 一切都恢复到原来的状态状态”。假设关联容器是使用自平衡二叉搜索树实现的(我不确定是否有任何其他可能性)进行比较只是为了沿着树走下去找到必须插入新节点的位置.如果在此过程中比较通过异常退出,则树尚未被修改,因此容器所要做的就是释放它此时为新元素分配的内存(如果有的话)。接下来的重新平衡步骤不会产生异常,因为它只涉及执行一堆树旋转和更新内部簿记数据,例如节点是红色还是黑色。