C++ - Erasure of container::reverse_iterator
C++ - Erasure of container::reverse_iterator
TL;DR
To erase a reverse_iterator rit, use container.erase(std::next(rit).base());.
Original Post
To erase a reverse_iterator, say rit, you can’t directly call container’s erase on it. Because standard library doesn’t have support for that. But you can use rit.base() to get the underlying (bidirectional) iterator.
And the issue comes out: the iterator reverse_iterator::base() returns the iterator after the element rit points to.
Let me draw a figure to make it clear:
1
2
begin ... rit rit.base() ... prev(end) end
x ... y z ... w nullptr
So if you erase(rit.base()), the behavior is not the same as you considered to erase the element rit pointing to. As a consequence, do it correctly with erase(std::next(rit).base());.
This post is licensed under CC BY 4.0 by the author.