template<typename Input, typename Pred> 
  typename iterator_traits<Input>::difference_type 
    count_if(Input first, Input last, Pred pred);

template<typename InputIt, typename Op> 
  Op for_each(InputIt first, InputIt last, Op op);

template<typename InputIt, typename OutputIt, typename Op> 
  OutputIt transform(InputIt first, InputIt last, OutputIt result, Op op);

template<typename ForwardIt, typename Gen> 
  void generate(ForwardIt first, ForwardIt last, Gen gen);

template<typename InputIt, typename OutputIt, typename T> 
  OutputIt remove_copy(InputIt first, InputIt last, OutputIt result, const T& val);

template<typename InputIt, typename OutputIt, typename Pred> 
  OutputIt remove_copy_if(InputIt first, InputIt last, OutputIt result, Pred pred);