C++ vector::erase不能与反向迭代器一起使用吗?

C++ vector::erase不能与反向迭代器一起使用吗?,c++,stl,C++,Stl,以下代码无法编译 some_vector.erase(some_vector.rbegin(), some_vector.rbegin()+1); 这只是一个例子,我知道删除最后n个元素有更好的选择。 GCC告诉我没有用于擦除的匹配函数。我是否做错了什么,或者不能使用反向迭代器?它可以与前向迭代器配合使用,尽管它不能。但是,反向迭代器提供了一个base()方法来获得正向迭代器。请注意,返回的正向迭代器指向反向迭代器指向的元素后面的元素 或者,换一种说法,.rbegin().base()=.en

以下代码无法编译

some_vector.erase(some_vector.rbegin(), some_vector.rbegin()+1);
这只是一个例子,我知道删除最后n个元素有更好的选择。
GCC告诉我没有用于擦除的匹配函数。我是否做错了什么,或者不能使用反向迭代器?它可以与前向迭代器配合使用,尽管它不能。但是,反向迭代器提供了一个
base()
方法来获得正向迭代器。请注意,返回的正向迭代器指向反向迭代器指向的元素后面的元素

或者,换一种说法,
.rbegin().base()=.end()
.rend().base()=.begin()

因此,固定代码如下所示:

some_vector.erase(
    (++(some_vector.rbegin())).base(),
    some_vector.rbegin().base()
);
注意,我们必须交换迭代器的顺序,因为它们是反向迭代器;第二个参数必须是序列中第一个迭代器之后的迭代器,但如果不交换反向迭代器的顺序,这将不正确。因此,如果我们有两个反向迭代器
a
b
,并且
b>=a
,那么我们可以将此惯用法用于
erase()


更一般地说,对于反向迭代器[a,b]的范围来说,范围[b.base(),a.base())以相反的顺序迭代相同的元素序列。

非常感谢,我从一周开始就试图调试代码,但没有成功,我从未假设base()是方法实际上返回了一个off-by-1迭代器…@AaaBbb对于推理反向迭代器是一个非常有价值的参考。
container.erase(b.base(), a.base());