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.
所以不,代码不安全。
我在文档中找不到任何关于 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.
所以不,代码不安全。