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

6
以下代码无法编译。
some_vector.erase(some_vector.rbegin(), some_vector.rbegin()+1);

这只是一个例子,我知道删除最后n个元素有更好的选项。GCC告诉我没有匹配的erase函数。我做错了什么,还是erase在反向迭代器上不起作用?不过它对于前向迭代器来说工作得很好。

1个回答

8

不会。但是,反向迭代器提供了一个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())以相反的顺序迭代相同的元素序列。

非常感谢,我已经试了一个星期都没能成功地调试我的代码,我从来没有想到 base() 方法实际上返回的是一个偏移量为1的迭代器... - Aaa Bbb
@AaaBbb 这个页面 是一个非常有价值的参考资料,可以帮助我们理解反向迭代器。 - cdhowie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接