c++ - std::vector在最后一个之后使用第一个迭代器删除

标签 c++ iterator range stdvector c++-standard-library

删除第一个迭代器在最后一个迭代器之后的范围时,会发生什么?

std::vector<int> v{1,2};

v.erase(
    v.begin() + 1,
    v.begin()
);
那其他容器呢?

最佳答案

未定义行为可以在任何容器上调用无效范围的erase。实际上,如果幸运的话,它通常会使程序崩溃,或者如果不幸的话,它将破坏相邻的内存。
对于几乎所有接受迭代器范围的API都应如此。如果范围无效,则基础代码/算法无法知道停止条件实际上是什么。

迭代器范围界定了任何输入或算法的范围的开始和结束。 end迭代器始终用于指示该范围的完成,并且必须始终可以通过重复递增第一个迭代器(例如,通过调用operator++)来访问。
大多数算法都是根据 operator!= 的要求,使用LegacyInputIterator来检测范围的完成情况。如果某个范围是 LegacyRandomAccessIterator ,则某些范围可以选择使用迭代器之间的距离。
无论哪种情况,此检测都要求第一个迭代器在最后一个迭代器之前,否则代码如下:

for (auto it = first; first != last; ++first) { ... }
永远不会达到范围的末尾,类似地:
auto distance = last - first;
将为迭代器之间的距离返回错误的值。

关于c++ - std::vector在最后一个之后使用第一个迭代器删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63493738/

相关文章:

vba - Excel vba清除一系列定期变化的数据

java - 在 Java 枚举中使用范围的种类

c++ - QHBoxLayout 中小部件之间的间距

C++ 如何触发类析构函数

c++ - 为什么我的 if 语句会跳过 else?

c++ - Comparator 可以用来设置新的 key ,不是吗?

c++ - ld : duplicate symbol

ruby - Ruby 的 Enumerator 对象如何在内部迭代器上进行外部迭代?

PHP 可迭代到数组或可遍历

javascript - 范围超过 Canvas 的奇怪错误