0

std::unordered_set::erase() 有 3 个重载:在一个引用中,传递一个“无效”值,即集合中不存在的值,简单地使 erase() 返回 0。但是呢?另外两个重载?

C++11 标准是否说明在这种情况下擦除()应该做什么,或者它取决于编译器?它应该返回 end() 还是未定义的行为?

我在规范、cppreference.com、cplusplus.com 中找不到答案。在 IBM 网站上,他们说如果操作后没有元素剩余,它会返回 end(),但是如果操作本身由于无效的迭代器而失败会发生什么?

通常,在这些情况下,STL 容器的 erase() 方法是否只是具有未定义的行为?(所以我需要在将任何迭代器传递给擦除()之前检查我的迭代器,或者使用 unordered_set::erase() 重载,它采用 value_type 引用,如果失败,它将简单地返回 0)

4

2 回答 2

4

尝试删除集合中未出现的值与尝试从无效迭代器中擦除之间存在很大的语义差异。

尝试使用无效的迭代器是未定义的行为,并且会以失败告终。

当您可能想要擦除无效的迭代器时,您是否有一个特定的用例?

于 2013-03-06T13:23:53.070 回答
2

这是两种完全不同的情况。没有“无效值”,集合中不存在的值仍然有效。因此,您传递了一个不包含在集合中的有效值,因此返回 0 - 没有元素被删除。

其他重载则完全不同。该标准要求传递给擦除方法的迭代器分别为“有效且可取消引用”和“有效的迭代器范围”。否则行为未定义。

所以是的,迭代器必须是有效的。但是您无法以编程方式检查迭代器是否有效 - 您必须从您的程序逻辑中确保它们是有效的。

于 2013-03-06T13:33:39.723 回答