/*
 *  The Find family
 *
 */

template<class In, class T> In find(In first, In last, const T& val);

template<class In, class Pred> In find_if(In first, In last, Pred p);



template<class For, class For2>
    For find_first_of(For first, For last, For2 first2, For2 last2);

template<class For, class For2, class BinPred>
    For find_first_of(For first, For last, For2 first2, For2 last2, BinPred p);



template<class For> For adjacent_find(For first, For last);

template<class For, class BinPred> For adjacent_find(For first, For last, BinPred p);


/*
 *  Usage
 *
 */

bool pred(int);

void f(vector<bool(*f)(int)>& v1, vector<int>& v2)
{
    find(v1.begin(),v1.end(),pred);     // find `pred'
    find_if(v2.begin(),v2.end(),pred);  // find int for which pred() returns true
}


int x[] = { 1,3,4 };
int y[] = { 0,2,3,4,5};

void f()
{
    int* p = find_first_of(x,x+3,y,y+5);        // p = &x[1]
    int* q = find_first_of(p+1,x+3,y,y+5);      // q = &x[2]
}


void f(vector<string>& text)
{
    vector<string>::iterator p = adjacent_find(text.begin(),text.end());
    if (p!=text.end() && *p=="the") { // I duplicated "the" again!
        text.erase(p);
        // ...
    }
}