/*
 *  Comparison
 *
 */

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

    typedef Cmp key_compare;

    class value_compare : public binary_function<value_type,value_type,bool> 
    {
        friend class map;
    protected:
        Cmp cmp;
        value_compare(Cmp c) : cmp(c) {}
    public:
        bool operator()(const value_type& x, const value_type& y) const
                { return cmp(x.first, y.first); }
    };

    key_compare key_comp() const;
    value_compare value_comp() const;
    // ...
};


/*
 *  Usage of comparison
 *
 */

map<string,int> m1;
map<string,int,Nocase> m2;                              // specify comparison type (_cont.comp_)
map<string,int,String_cmp> m3;                          // specify comparison type (_cont.comp_)
map<string,int,String_cmp> m4(String_cmp(literary));    // pass comparison object


void f(map<string,int>& m)
{
    map<string,int> mm;                 // compare using < by default
    map<string,int> mmm(m.key_comp());  // compare the way m does
    // ...
}