34

I have such code :

vector <int> v;
for (int i=0; i<5; i++)
        v.push_back(i);
v.erase(find(v.rbegin(), v.rend(),2).base());

This code deletes the first element from vector v after first detected 2 (in vector remain: 0 1 2 4). What does .base() do here?

Vitali K
  • 577
  • 1
  • 6
  • 12
  • 2
    Maybe you should read this : http://www.cplusplus.com/reference/iterator/reverse_iterator/base/ – JBL May 17 '13 at 12:31

1 Answers1

44

base() converts a reverse iterator into the corresponding forward iterator. However, despite its simplicity, this correspondence is not as trivial as one might thing.

When a reverse iterator points at one element, it dereferences the previous one, so the element it physically points to and the element it logically points to are different. In the following diagram, i is a forward iterator, and ri is a reverse iterator constructed from i:

                             i, *i
                             |
    -      0     1     2     3     4     -
                       |     | 
                       *ri   ri

So if ri logically points to element 2, it physically points to element 3. Therefore, when converted to a forward iterator, the resulting iterator will point to element 3, which is the one that gets removed in your example.

The following small program demonstrates the above behavior:

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

int main(int argc, char *argv[])
{
    std::vector<int> v { 0, 1, 2, 3, 4 };
    auto i = find(begin(v), end(v), 2);

    std::cout << *i << std::endl; // PRINTS 2

    std::reverse_iterator<decltype(i)> ri(i);
    std::cout << *ri << std::endl; // PRINTS 1
}

Here is a live example.

Andy Prowl
  • 124,023
  • 23
  • 387
  • 451
  • 1
    It appears the diagram does not match the code. In the code `i` points to `2`, but the diagram shows that `i` points to `3` (at least on my browser). – aafulei Mar 15 '22 at 12:43
  • @aafulei The diagram refers to the situation in original question, where the `3` was being removed. The code is a separate example. – Dan Jul 01 '23 at 21:55