【发布时间】:2013-12-22 23:37:39
【问题描述】:
我目前正在编写异常安全代码,我的设计不需要任何抛出保证 set::find 方法。 我假设比较器对象总是成功的。 这是否意味着 set::find 方法总是会成功?
在我看到根据http://en.cppreference.com/w/cpp/container/set/erase,set::erase 方法,在相同的假设下,我想到了这种可能性,应该总是成功,也许其中有一个发现(那么它绝对值得评论在文档中!)
问题的直接根源是我需要检查一个元素是否在集合中并将其从集合中删除——所有这些都没有抛出保证(它在一个 catch 块中)。
【问题讨论】:
-
我不确定 set 或任何 stl 容器的标准或任何保证,但我会这么说。有一次我调用 vector::erase(v.end()).. 它抛出异常..我花了几个小时试图找出原因。原来我的向量是空的。不确定这是否仍然发生,或者 std::set 是否有这个问题,但它发生在我的 gcc 4.8.1 for windows 中。我最终不得不做一个 if 语句检查
vector::find != v.end()。我想你可能不得不这样做。这可能是你唯一一次确定没有例外? -
@CantChoose 对于空向量和非空向量,这是未定义的行为。您无法删除末尾的第一个元素...
-
@CantChooseUsernames 你应该很高兴它抛出了异常。这是未定义的行为 AFAIK,可能已经擦除了您的硬盘;)