//  (C) Porkolab 2003
//
//  A.6.31



template<class In, class Out>
        Out copy(In first, In last, Out res)
{
    while (first != last) *res++ = *first++;
    return res;
}

template<class Bi, class Bi2>
        Bi2 copy_backward(Bi first, Bi last, Bi2 res)
{
    while (first != last) *--res = *--last;
    return res;
}

template<class In, class Out, class Pred>
        Out copy_if(In first, In last, Out res, Pred p)
{
    while (first != last) {
    if (p(*first)) *res++ = *first;
    ++first;
    }
    return res;
}


/*
 *  Usage
 *
 */

void f(list<Club>& lc, ostream& os)
{
    copy(lc.begin(),lc.end(),ostream_iterator<Club>(os));
}


void f(vector<char>& vs)
{
    vector<char> v;

    copy(vs.begin(),vs.end(),v.begin());    // error: might overwrite end of v
    copy(vs.begin(),vs.end(),back_inserter(v)); // ok: add elements from vs to end of v
}


void f(list<int>&ld, int n, ostream& os)
{
    copy_if(ld.begin(),ld.end(),ostream_iterator<int>(os),bind2nd(greater<int>(),n));
}