// Example 10-2: Removing matching items from a sequence container.
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <list>
#include <ostream>

// Erase all items from container c that are equal to item.
template<typename C>
void erase(C& c, const typename C::value_type& item)
{
  c.erase(std::remove(c.begin(), c.end(), item), c.end());
}

template<typename C, typename Pred>
void erase_if(C& c, Pred pred)
{
  c.erase(std::remove_if(c.begin(), c.end(), pred), c.end());
}

int main()
{
  std::list<int> lst;
  
  lst.push_back(10);
  lst.push_back(20);
  lst.push_back(30);
  lst.push_back(20);
  lst.push_back(40);
  lst.push_back(10);

  // Erase all items == 20.
  erase(lst, 20);
  std::copy(lst.begin(), lst.end(),
    std::ostream_iterator<int>(std::cout, " "));
  std::cout << std::endl;

  // Erase all items < 20.
  erase_if(lst, std::bind2nd(std::less<int>(), 20));
  std::copy(lst.begin(), lst.end(),
    std::ostream_iterator<int>(std::cout, " "));
  std::cout << std::endl;
}
