删除第一个迭代器在最后一个迭代器之后的范围时,会发生什么?
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/