std :: unordered_set :: erase()有3个重载:在一个引用的引用中,传递一个“无效”值,即该组中不存在的值,只是使erase()返回0。但是那另外两个重载呢?
C ++ 11标准是否说明在这种情况下擦除()应该做什么,或者它依赖于编译器?是应该返回end()还是未定义的行为?
我在规范cppreference.com,cplusplus.com中找不到答案。在IBM站点上,如果操作后没有剩余元素,它们会返回end(),但如果操作本身因迭代器无效而失败会发生什么?
一般来说,在这些情况下,STL容器的erase()方法是否只是具有未定义的行为? (所以我需要在传递任何擦除()之前检查我的迭代器,或者使用带有value_type引用的unordered_set :: erase()重载,如果失败则返回0)
答案 0 :(得分:4)
尝试删除set中没有出现的值和尝试从无效的迭代器中删除之间存在很大的语义差异。
尝试使用无效的迭代器是未定义的行为,并且会以严重的方式结束。
当你想要删除无效的迭代器时,你是否有一个特定的用例?
答案 1 :(得分:2)
这是两个完全不同的案例。没有“无效值”,集合中不存在的值仍然有效。因此,您传递一个未包含在集合中的有效值,从而返回0 - 没有元素被删除。
其他重载完全不同。该标准要求传递给擦除方法的迭代器分别是“有效和可解除引用”和“有效迭代器范围”。否则行为未定义。
所以是的,迭代器必须是有效的。但是你无法以编程方式检查迭代器是否有效 - 你必须从程序逻辑中确定它们是否正确。