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