繁体   English   中英

std::vector 在最后一个之后用第一个迭代器擦除

[英]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.

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