[英]std::vector erasing with first iterator after last
当擦除第一个迭代器在最后一个迭代器之后的范围时会发生什么?
std::vector<int> v{1,2};
v.erase(
v.begin() + 1,
v.begin()
);
其他容器呢?
在任何容器上使用无效范围调用erase
是未定义的行为。 在实践中,它通常会在你运气好时使程序崩溃,或者在你运气不好时粉碎相邻的 memory。
对于几乎所有接受迭代器范围的 API 来说,这应该是正确的。 如果范围无效,则底层代码/算法无法知道停止条件的实际情况。
迭代器范围界定任何输入或算法范围的开始和结束。 end
迭代器始终用于指示该范围的完成,并且必须始终可以通过重复递增第一个迭代器(例如,通过调用operator++
)来访问。
根据LegacyInputIterator
要求,大多数算法都使用operator!=
来检测范围的完成。 如果该范围是LegacyRandomAccessIterator
,则某些范围可以选择使用迭代器之间的距离。
在任何一种情况下,此检测都要求第一个迭代器在最后一个迭代器之前,否则代码如下:
for (auto it = first; first != last; ++first) { ... }
永远不会到达范围的尽头,类似地:
auto distance = last - first;
将为迭代器之间的距离返回不正确的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.