// Example 10-7: Using a reverse iterator.
#include <algorithm>
#include <iostream>
#include <iterator>
#include <list>

template<typename T>
void print(const std::list<T>& lst)
{
  std::copy(lst.begin(), lst.end(),
            std::ostream_iterator<T>(std::cout, "\n"));
}

int main()
{
  std::list<int> l;
  l.push_back(10); l.push_back(42); l.push_back(99);
  print(l);
  std::list<int>::reverse_iterator ri;
  ri = std::find(l.rbegin(), l.rend(), 42);
  l.insert(ri.base(), 33);
  // Okay: 33 inserted before 42, from the point of view
  // of a reverse iterator, that is, 33 inserted after 42.

  ri = std::find(l.rbegin(), l.rend(), 42);
  l.erase(ri.base());
  // Oops! Item 33 is deleted, not item 42.

  ri = std::find(l.rbegin(), l.rend(), 42);
  l.erase((++ri).base());
  // That's right! In order to delete the item ri points to,
  // you must advance ri first, then delete the item.
}
