以下代码将无法编译
some_vector.erase(some_vector.rbegin(), some_vector.rbegin()+1);
Run Code Online (Sandbox Code Playgroud)
这只是一个例子,我知道删除最后n个元素有更好的选择.GCC告诉我没有匹配的擦除功能.我做错了什么或擦除不适用于反向迭代器?但它可以正常使用前向迭代器
它不是.但是,反向迭代器提供了base()一种获取前向迭代器的方法.请注意,返回的前向迭代器指向反向迭代器指向的元素后面的元素.
或者,换句话说,.rbegin().base() == .end()和.rend().base() == .begin()
所以固定代码看起来像这样:
some_vector.erase(
    (++(some_vector.rbegin())).base(),
    some_vector.rbegin().base()
);
Run Code Online (Sandbox Code Playgroud)
注意,我们必须交换迭代器的顺序,因为它们是反向迭代器; 第二个参数必须是一个跟在序列中第一个迭代器的迭代器,但是没有交换反向迭代器的顺序,这不是真的.因此,如果我们有两个相反的迭代a和b,和b >= a那么我们就可以用这个成语erase():
container.erase(b.base(), a.base());
Run Code Online (Sandbox Code Playgroud)
更一般地说,它适用于反向迭代器[a,b]的范围,范围[b.base(),a.base())以相反的顺序迭代相同的元素序列.