In addition to forward iterators, bidirectional iterators satisfy the following requirements:
Bidirectional Iterator Requirements (additional to forward iterators'):
Bidirectional iterators allow algorithms to pass through the elements forward and backward.
list<int> l (1, 1);
l.push_back (2);	// list l: 1 2
list<int>::iterator first = l.begin();
list<int>::iterator last  = l.end();
while (last != first) {
  --last;
  cout << *last << " ";
}
Output: 2 1
template <class BidirectionalIterator, class Compare>
void bubble_sort (BidirectionalIterator first, BidirectionalIterator last,
                  Compare comp)
{
  BidirectionalIterator left_el = first, right_el = first;
  right_el++;
  while (first != last)
  {
    while (right_el != last) {
      if (comp(*right_el, *left_el)) iter_swap (left_el, right_el);
      right_el++;
      left_el++;
    }
    last--;
    left_el = first, right_el = first;
    right_el++;
  }
}
The binary function object Compare has to be provided by the user of bubble_sort. Compare, which implements a binary predicate, takes two arguments and returns the result (true or false) of the predicate provided with the two arguments.
list<int> l; // fill list bubble_sort (l.begin(), l.end(), less<int>() ); // sort ascendingly bubble_sort (l.begin(), l.end(), greater<int>() ); // sort descendingly
sorts the list ascendingly.
Johannes Weidl (J.Weidl@infosys.tuwien.ac.at) - Apr 16, 1996