Listing 5

// synopsis of template class multimap

template <class Key, class Ty,
  class Pr = std::less<Key>,
  class Alloc = std::allocator<std::pair<const Key, Ty> > >
class multimap { // ordered container holding (Key, Ty) pairs
public:
    // NESTED TYPES
    typedef Key key_type;
    typedef Ty mapped_type;
    typedef Pr key_compare;
    typedef Alloc allocator_type;
    typedef std::pair<const Key, Ty> value_type;
    class value_compare;
    typedef Alloc::pointer pointer;
    typedef Alloc::const_pointer const_pointer;
    typedef Alloc::reference reference;
    typedef Alloc::const_reference const_reference;
    typedef T0 size_type;
    typedef T1 difference_type;
    typedef T2 iterator;
    typedef T3 const_iterator;
    typedef std::reverse_iterator<iterator> reverse_iterator;
    typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

    // CONSTRUCTORS
    multimap();
    explicit multimap(const Pr& pr);
    multimap(const Pr& pr, const Alloc& al);
    multimap(const multimap& right);
    template <class InIt>
    multimap(InIt first, InIt last);
    template <class InIt>
    multimap(InIt first, InIt last, const Pr& pr);
    template <class InIt>
    multimap(InIt first, InIt last, const Pr& pr, const Alloc& al);

    // MODIFICATION
    iterator insert(const value_type& val);
    iterator insert(iterator hint, const value_type& val);
    template <class InIt>
    void insert(InIt first, InIt last);

    iterator erase(iterator pos);
    iterator erase(iterator first, iterator last);
    iterator erase(cosnt Key& key);
    void clear();

    void swap(multimap& right);
  
    // CONTAINER ITERATORS
    iterator begin();
    const_iterator begin() const;
    iterator end();
    const_iterator end() const;
    reverse_iterator rbegin();
    const_reverse_iterator rbegin() const;
    reverse_iterator rend();
    const_reverse_iterator rend() const;

    // ELEMENT ACCESS
    iterator find(const Key& key);
    const_iterator find(const Key& key) const;
    size_type count(const Key& key) const;
    iterator lower_bound(const Key& key);
    const_iterator lower_bound(const Key& key) const;
    iterator upper_bound(const Key& key);
    const_iterator upper_bound(const Key& key) const;
    pair<iterator, iterator> equal_range(const Key& key);
    pair<const_iterator, const_iterator> equal_range(const Key& key) const;

    // QUERIES
    size_type size() const;
    size_type max_size() const;
    bool empty() const;
    Alloc get_allocator() const;
    key_compare key_comp() const;
    value_compare value_comp() const;
};

template <class Key, class Ty, class Pr, class Alloc>
bool operator==(
  const multimap<Key, Ty, Pr, Alloc>&,
  const multimap<Key, Ty, Pr, Alloc>&);
/* analogous template functions for !=, <, <=, >, and >= */

template <class Key, class Ty, class Pr, class Alloc>
void swap(
  const multimap<Key, Ty, Pr, Alloc>&,
  const multimap<Key, Ty, Pr, Alloc>&);