std::vector::erase 无效范围

std::vector::erase for invalid ranges

我在文档中找不到任何关于 std::vector::erase 的无效范围(非空,erase 已为它们定义明确),例如 [end()+1, end())。例如:

std::vector<int> v;
v.erase(std::find(b.begin(), v.end(), 9001) + 1, v.end());

使用此代码删除一个特定元素后的元素是否安全,或者是否有必要检查 std::find 是否返回了某些内容 != v.end()

v.erase(std::find(b.begin(), v.end(), 9001) + 1, v.end());

你必须确保 find 不会 return end() 因为在这种情况下范围将是无效的 [end()+1, end()] 这是未定义的行为。

但是,如果您执行以下操作,那么您就完全超出了未定义的行为范围。

v.erase(std::find(b.begin(), v.end(), 9001), v.end());

来自http://www.cplusplus.com/reference/vector/vector/erase/

在异常安全中:

[..] An invalid position or range causes undefined behavior.

所以不,代码不安全。