//  (C) Porkolab 2003
//
//  A.6.17.
//  Special operations on map



template <class Key, class T, class Cmp = less<Key>,
        class A = allocator< pair<const Key,T> > >
class map {
public:
    // ...
    // map operations:

    iterator find(const key_type& k);           // find element with key k
    const_iterator find(const key_type& k) const;

    size_type count(const key_type& k) const;   // find number of elements with key k

    iterator lower_bound(const key_type& k);    // find first element with key k
    const_iterator lower_bound(const key_type& k) const;
    iterator upper_bound(const key_type& k);    // find first element with key greater than k
    const_iterator upper_bound(const key_type& k) const;

    pair<iterator,iterator> equal_range(const key_type& k);
    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;

    // ...
};



/*
 *  Usage
 *
 */

void f(map<string,int>& m)
{
    map<string,int>::iterator p = m.find("Gold");
    if (p!=m.end()) {               // if "Gold" was found
        // ...
    }
    else if (m.find("Silver")!=m.end()) {   // look for "Silver"
    // ...
    }
    // ...
}


void f(multimap<string,int>& m)
{
    multimap<string,int>::iterator lb = m.lower_bound("Gold");
    multimap<string,int>::iterator ub = m.upper_bound("Gold");

    for (multimap<string,int>::iterator p = lb; p!=ub; ++p) {
        // ...
    }
}