繁体   English   中英

无效迭代器的结果传递给std :: unordered_set :: erase()

[英]Result of invalid iterator passed to std::unordered_set::erase()

std :: unordered_set :: erase()有3个重载:在一个引用中,传递一个“无效”值,即,该值不存在的值,仅使delete()返回0。其他两个超载?

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

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

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

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

尝试使用无效的迭代器是未定义的行为,并且将严重失败。

您是否在考虑何时要删除无效的迭代器的特定用例?

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

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

所以是的,迭代器必须有效。 但是您不能检查迭代器在程序上是否有效-您必须从程序逻辑中确保它们是有效的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM