C++ 传递给std::无序_set::erase()的无效迭代器的结果

C++ 传递给std::无序_set::erase()的无效迭代器的结果,c++,c++11,iterator,std,C++,C++11,Iterator,Std,std::unordered_set::erase()有3个重载:在获取引用的重载中,传递一个“无效”值,即在集合中不存在的重载,只会使erase()返回0。但是其他两个重载呢 C++11标准说明了在这种情况下erase()应该做什么,还是说它依赖于编译器?它应该返回end()还是未定义的行为 我在规范cppreference.com、cplusplus.com中找不到答案。在IBM站点上,他们说如果操作后没有元素保留,它将返回end(),但如果操作本身由于无效迭代器而失败,会发生什么情况 一般

std::unordered_set::erase()有3个重载:在获取引用的重载中,传递一个“无效”值,即在集合中不存在的重载,只会使erase()返回0。但是其他两个重载呢

C++11标准说明了在这种情况下erase()应该做什么,还是说它依赖于编译器?它应该返回end()还是未定义的行为

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

一般来说,STL容器的erase()方法在这种情况下是否有未定义的行为?
(因此,在我将任何值传递给erase()之前,我需要检查迭代器,或者使用无序的_set::erase()重载,该重载接受一个值类型引用,如果失败,它将简单地返回0)

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

尝试使用无效的迭代器是未定义的行为,结果将很糟糕


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

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

尝试使用无效的迭代器是未定义的行为,结果将很糟糕


当您想要删除无效的迭代器时,您是否考虑了特定的用例?

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

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


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

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

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


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

如果您处理的是无效的迭代器,那么您已经在其他地方出错了。标准库不在乎。为什么要这样做?它只允许您访问有效的迭代器-之后您所做的任何事情都是您的问题。如果您正在处理无效的迭代器,那么您已经在其他地方出错了。标准库不在乎。为什么要这样做?它只允许你访问有效的迭代器——你以后做的任何事情都是你的问题。不,但我想知道会发生什么。对于“使用无效迭代器删除”或“使用指向另一个容器中的值的有效迭代器删除”之类的情况,是否有任何已定义的行为,例如“无任何更改”?我想知道会发生什么,以便我的代码可以使用assert()捕获它无法检测到的所有无效内容。正如111111的回答所说,传递给
erase
的无效迭代器会导致未定义的行为。@us2012,即使它是指向其他容器的有效迭代器?我想知道它是否保证erase()什么都不做,或者任何析构函数结果都可能是未定义的behavior@fr33domlover对其他容器的迭代器也会导致未定义的行为。更糟糕的是,在我看来,一个迭代器到另一个容器被传递到
erase
的唯一可能性表明您的代码中存在非常严重的设计缺陷。不,但我想知道会发生什么。对于“使用无效迭代器删除”或“使用指向另一个容器中的值的有效迭代器删除”之类的情况,是否有任何已定义的行为,例如“无任何更改”?我想知道会发生什么,以便我的代码可以使用assert()捕获它无法检测到的所有无效内容。正如111111的回答所说,传递给
erase
的无效迭代器会导致未定义的行为。@us2012,即使它是指向其他容器的有效迭代器?我想知道它是否保证erase()什么都不做,或者任何析构函数结果都可能是未定义的behavior@fr33domlover对其他容器的迭代器也会导致未定义的行为。更糟糕的是,在我看来,将迭代器传递到另一个容器的唯一可能性传递给
erase
表明您的代码中存在非常严重的设计缺陷。