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

时间:2017-05-18 02:50:35

标签: c++ stl

以下代码无法编译

some_vector.erase(some_vector.rbegin(), some_vector.rbegin()+1);

这只是一个例子,我知道删除最后n个元素有更好的选择。 GCC告诉我没有匹配的擦除功能。我做错了什么或擦除不适用于反向迭代器?它适用于前向迭代器,但

1 个答案:

答案 0 :(得分:6)

没有。但是,反向迭代器提供了一个base()方法来获取前向迭代器。请注意,返回的前向迭代器指向反向迭代器指向的元素后面的元素。

或者换句话说,.rbegin().base() == .end().rend().base() == .begin()

所以固定代码看起来像这样:

some_vector.erase(
    (++(some_vector.rbegin())).base(),
    some_vector.rbegin().base()
);

请注意,我们必须交换迭代器的顺序,因为它们是反向迭代器;第二个参数必须是一个迭代器,跟随序列中的第一个迭代器,但是没有交换反向迭代器的顺序,这不会是真的。因此,如果我们有两个反向迭代器ab以及b >= a,那么我们可以将这个习惯用于erase()

container.erase(b.base(), a.base());

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