什么std::map
如果定制比较再平衡过程中抛出一个异常会做什么?显然,它应该记住所有先前的回合,并将所有内容恢复为原始状态。是真的吗
参见[associative.reqmts.except]:
对于关联容器,没有
clear()
函数会引发异常。erase(k)
不会引发异常,除非容器的Compare
对象(如果有)引发了该异常。对于关联容器,如果插入单个元素的
insert
oremplace
函数中的任何操作都引发了异常,则插入无效。对于关联容器,
swap
除非容器容器的交换Compare
(如果有)引发该异常,否则任何函数都不会引发异常。
因此,您基本上是对的(在插入单个元素的情况下),但这并不意味着容器必须“记住所有先前的转弯”才能“将一切恢复到原始状态”。假设使用自平衡二进制搜索树(不知道是否还有其他可能性)实现关联容器,则仅进行比较以使树向下走以找到必须在其中插入新节点的位置。如果在此过程中通过异常退出比较,则该树尚未被修改,因此容器要做的就是此时释放为新元素分配的内存(如果有)。随后的重新平衡步骤无法生成异常,
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句