当在反向迭代过程中使用擦除来删除向量的第一个元素时,这是由范围外引起的崩溃



以下代码可以重现崩溃。

#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> tests;
tests.push_back(1);
tests.erase(tests.rbegin().base());
return 0;
}

如果我使用普通迭代器,那么擦除函数调用不会导致崩溃。有人知道这个机制是什么吗?我想请你解释一下。

顺便说一句,我尝试使用反向迭代器的原因是,在反向迭代过程中删除向量的元素不会跳过在没有额外代码的情况下对删除元素后的元素进行迭代。

来源https://en.cppreference.com/w/cpp/iterator/reverse_iterator/base:

基迭代器指的是reverse_iterator当前指向的元素的下一个元素(从std::reverse_iterator::iterator_type的角度来看(。即&*(rit.base() - 1) == &*rit

这意味着,在我的理解中,你试图用反向迭代器从最后一个元素开始,当你得到它的基时,你实际上是在访问最后一个元件之后的元件。这一次显然总是在射程之外。

我希望这有助于澄清。如果我误解了什么,请随时纠正我。