VMS Help
CXXLSTD, Containers

 *Conan The Librarian

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   Containers  -	A standard template library (STL) collection.

 DESCRIPTION

   Within the standard template library,	collection classes are often
   described as containers.  A container	stores a collection of other
   objects and provides certain basic functionality that	supports the
   use of generic algorithms.  Containers come in two basic flavors:
   sequences, and associative containers.  They are further
   distinguished  by the type of iterator they support.

   A sequence supports a	linear arrangement of single elements. vector,
   list,deque, bitset, and string fall into this category.  Associative
   containers map values onto keys, which provides efficient retrieval
   of the values based on the keys.  The STL provides the map,
   multimap,  set and multiset associative containers. map and multimap
   store the  value and the key separately and allow for fast retrieval
   of the value, based upon fast retrieval of the key.	 set and
   multiset store	only keys  allowing fast retrieval of the key
   itself.

 CONTAINER REQUIREMENTS

   Containers within the	STL must meet the following requirements.
   Sequences and associative containers must also meet their own
   separate sets of requirements. The requirements for containers are:

   +	  A container allocates	all storage for	the objects it holds.

   +	  A container X	of objects of type T provides the following types:

        X::value_type    a T

        X::reference     lvalue of T

        X::const_reference const lvalue of T

        X::iterator    an iterator type pointing	to T.  X::iterator
                       cannot be an output iterator.

        X::const_iterator   an iterator type pointing to const T

        x::iterator cannot be an output iterator.

        X::difference_type    a signed integral type (must be the same as
                              the distance type for X::iterator and
                              X::const_iterator

        X::size_type    an unsigned integral type representing any non-
                        negative value of difference_type

        X::allocatr_type	  type of allocator used to obtain storage for
                           elements stored in the container

   +	  A container provides a default constructor, a	copy
           constructor, an assignment operator, and a full complement of
           comparison operators (==, !=,	<, >, <=, >=).

   +	  A container provides the following member functions:

           begin()  Returns an iterator or a const_iterator pointing
                    to the first element in  the collection.

           end()   Returns an iterator or a const_iterator pointing just
                   beyond the last element in the collection.

           swap(container) Swaps elements between this container and
                           the swap's argument.

           clear()  Deletes all the elements in the container.

           size()   Returns the number of elements in the collection
                    as a size_type.

           max_size()   Returns the largest possible number of elements
                        for this type of container as a size_type.

           empty()  Returns true if the container is empty, false
                    otherwise.

           get_allocator() Returns the allocator used by this container

 REVERSIBLE CONTAINERS

   A container may be reversible.  Essentially, a reversible container
   provides a reverse iterator that allows traversal of the collection
   in a direction opposite that of the default iterator.  A reversible
   container must meet the following requirements in addition to those
   listed above:

   +	  A reversible container provides the following	types:

           X::reverse_iterator    An iterator type pointing to T.

           X::const_reverse_iterator An iterator type pointing to
                                     const T

   +	  A reversible container provides the following	member functions:

           rbegin() Returns a reverse_iterator or a const_reverse_iterator
 		   pointing past the end of  the collection

           rend()   Returns a reverse_iterator or a const_reverse_iterator
                    pointing to the first element in the collection.

 SEQUENCES

   In addition to the requirements for containers, the following
   requirements hold for sequences:

   +	  iterator and const_iterator must be forward iterators,
           bidirectional iterators or random access iterators.

   +	  A sequence provides the following constructors:

        X(n, t)	 Constructs a container	with n copies of t.

        X(i, j)	 Constructs a container	with elements from the
                  range [i,j).

   +	  A sequence provides the following member functions:

        insert(p,t)   Inserts the element t in front of the position
                      identified	by the iterator	p.

        insert(p,n,t)   Inserts n copies	of  t in front of the position
                        identified by the iterator p.

        insert(p,i,j)   Inserts elements	from the range [i,j) in	front
                        of the position identified by the iterator p.

        erase(q)	  Erases the element pointed to	by the iterator	q.

        erase(q1,q2)   Erases the elements in the range [q1,q2).

   +	  A sequence may also provide the following member functions
           if they can be implemented with constant time complexity.

        front()	 Returns the element pointed to	by begin()

        back()	Returns	the element pointed to by end()

        push_front(x)   Inserts the element x at	begin()

        push_back(x)   Inserts the element x at end()

        pop_front()   Erases the	element	at begin()

        pop_back()   Erases the element at end()	-1

        operator[](n)   Returns the element at a.begin()	+ n

 ASSOCIATIVE CONTAINERS

   In addition to the requirements for a	container, the following
   requirements hold for associative containers:

   +	  For an associative container iterator	and const_iterator
           must be bidirectional iterators.  Associative containers
           are inherently sorted.  Their iterators proceed through
           the container in the nondescending order of keys (where
           non-descending order is defined by the comparison object
           that was used to construct the container).

   +	  An associative container provides the	following types:

        X::key_type    the type of the Key

        X::key_compare the type of the comparison to use to put
                       the keys in order

        X::value_compare	 the type of the comparison used on values

   +	  The default constructor and copy constructor for
           associative containers use the template parameter
           comparison class.

   +	  An associative container provides the	following
           additional constructors:

        X(c)   Construct	an empty container using c  as	the
               comparison object

        X(i,j,c)	  Constructs a container with elements from the
                   range  [i,j) and the comparison object c.

        X(i, j)	 Constructs a container	with elements from the
                  range [i,j) using the template parameter comparison
                  object.

   +	  An associative container provides the	following member
           functions:

        key_comp()   Returns the	comparison object used in constructing
                     the associative container.

        value_comp() Returns the value	comparison object used in
                     constructing the associative container.

        insert(t)   Inserts t if	and only if there is no	element	in
                    the container with key equal to the	key of t.
                    Returns a pair<iterator,bool>.  The bool component
                    of the returned pair	indicates the success or
                    failure  of the operation and the iterator
                    component points  to the element with key equal
                    to key of t.

        insert(p,t) If the container does not support redundant key
                    values then this function only inserts t if	there
                    is no key present that is equal to the key of t.
                    If the container does support redundant keys then
                    this function always inserts the element t. The iterator
                    p serves as a hint of where to start searching, allowing
                    for some optimization of the insertion.  It does not
                    restrict the algorithm from inserting ahead of that
                    location if necessary.

        insert(i,j) Inserts elements from the range [i,j).

        erase(k)	   Erases all elements with key equal to k. Returns
                    number of erased elements.

        erase(q)	  Erases the element pointed to	by q.

        erase(q1,q2)   Erases the elements in the range [q1,q2).

        find(k)	 Returns an iterator pointing to an element with key
                  equal to k or end() if such an element is not found.

        count(k)	  Returns the number of	elements with key equal	to k.

        lower_bound(k)	Returns	an iterator pointing to	the first
                         element with a key greater than or equal to k.

        upper_bound(k)	Returns	an iterator pointing to	the first
                         element with a key less than or equal to k.

        equal_range(k)	Returns	a pair of iterators such that the
                         first element of the pair is equivalent to
                         lower_bound(k) and the second element equivalent
                         to upper_bound(k).

 SEE ALSO

   bitset, deque, list, map, multimap, multiset,	priority_queue,	queue,
   set, stack, vector

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  1 - Associative Containers

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   Associative_Containers  - Associative	containers are ordered
   containers.  These containers provide member functions that allow
   the efficient insertion, retrieval and manipulation of keys.   The
   standard library provides the map, multimap, set and multiset
   associative containers. map and multimap associate values with the
   keys and allow for fast retrieval of the value, based upon fast
   retrieval of the key.	set and	multiset store only keys, allowing
   fast retrieval of the key itself.

 SEE ALSO

   For more information about associative containers, see the
   Containers section of this reference guide, or see the section on
   the specific container.

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  2 - Bitset

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   bitset  - A template class and related functions for storing and
   manipulating fixed-size sequences of bits.

 SYNOPSIS

   #include <bitset>

   template <size_t N>
   class	bitset ;

 DESCRIPTION

   bitset<size_t	N> is a	class that describes objects that can
   store a sequence consisting of a fixed number	of bits, N. Each
   bit represents either the value zero	(reset)	or one (set) and
   has a non-negative position pos.

   ERRORS AND EXCEPTIONS

   Bitset constructors and member functions may report the following
   three types of errors -- each associated with a distinct exception:

   +	  invalid-argument error or invalid_argument() exception;

   +	  out-of-range error or	out_of_range() exception;

   +	  overflow error or over-flow_error() exception;

   If exceptions	are not	supported on your compiler, you	will get an
   assertion failure instead of an exception.

 INTERFACE

   template <size_t N>
   class	bitset {

   public:

   // bit reference:

    class reference {
     friend class bitset<N>;
    public:

      ~reference();
     reference& operator= (bool);
     reference& operator= (const	reference&);
     bool operator~() const;
     operator bool() const;
     reference& flip();
     };

   // Constructors
    bitset ();
    bitset (unsigned long);
    explicit bitset (const string&, size_t = 0,
 		    size_t = (size_t)-1);
    bitset (const bitset<N>&);
    bitset<N>& operator=	(const bitset<N>&);

   // Bitwise Operators and Bitwise Operator Assignment
     bitset<N>& operator&= (const bitset<N>&);
     bitset<N>& operator|= (const bitset<N>&);
     bitset<N>& operator^= (const bitset<N>&);
     bitset<N>& operator<<= (size_t);
     bitset<N>& operator>>= (size_t);

   // Set, Reset, Flip
     bitset<N>& set ();
     bitset<N>& set (size_t, int	= 1);
     bitset<N>& reset ();
     bitset<N>& reset (size_t);
     bitset<N> operator~() const;
     bitset<N>& flip ();
     bitset<N>& flip (size_t);

   // element access
     reference operator[] (size_t);
     unsigned long to_ulong() const;
     string to_string() const;
     size_t count() const;
     size_t size() const;
     bool operator== (const bitset<N>&) const;
     bool operator!= (const bitset<N>&) const;
     bool test (size_t) const;
     bool any() const;
     bool none()	const;
     bitset<N> operator<< (size_t) const;
     bitset<N> operator>> (size_t) const;

   };

   // Non-member	operators
   template <size_t N>
   bitset<N> operator& (const bitset<N>&, const bitset<N>&);

   template <size_t N>
   bitset<N> operator| (const bitset<N>&, const bitset<N>&);

   template <size_t N>
   bitset<N> operator^ (const bitset<N>&, const bitset<N>&);

   template <size_t N>
   istream& operator>> (istream&, bitset<N>&);

   template <size_t N>
   ostream& operator<< (ostream&, const bitset<N>&);

 CONSTRUCTORS

   bitset();
      Constructs	an object of class bitset<N>, initializing all bit
      values to zero.

   bitset(unsigned long val);
      Constructs	an object of class bitset<N>, initializing the first M
      bit values to the corresponding bits in val. M is the smaller  of
      N and the value CHAR_BIT * sizeof(unsigned  long).  If M < N,
      remaining bit positions are initialized to zero.  Note:  CHAR_BIT
      is defined in <climits>.

   explicit
   bitset(const string& str, size_t pos = 0,
 	size_t n = (size_t)-1);
      Determines the effective length rlen	of the	initializing
      string as the smaller of n and str.size() -	pos. The
      function  throws an invalid_argument exception if any of the rlen
      characters in str, beginning at position pos,is other than 0  or
      1. Otherwise, the function  constructs an object of class
      bitset<N>, initializing the first M bit positions to	values
      determined from the corresponding characters in the string  str.
      M is the smaller of N and rlen.  This constructor  requires that
      pos <= str.size(), otherwise it throws an  out_of_range
      exception.

   bitset(const bitset<N>& rhs);
      Copy constructor.	Creates	a copy of rhs.

 ASSIGNMENT OPERATOR

   bitset<N>&
   operator=(const bitset<N>& rhs);
      Erases all	bits in	self, then inserts into	self a copy of each
      bit in rhs.  Returns a reference to *this.

 OPERATORS

   bool
   operator==(const bitset<N>& rhs) const;
      Returns true if the value of each bit in *this equals the value
      of	each corresponding bit in rhs.	Otherwise returns false.

   bool
   operator!=(const bitset<N>& rhs) const;
      Returns true if the value of any bit in *this is not equal	to
      the value of the corresponding bit in rhs. Otherwise returns
      false.

   bitset<N>&
   operator&=(const bitset<N>& rhs);
      Clears each bit in	*this for which	the corresponding bit in rhs
      is	clear and leaves	all other bits unchanged. Returns *this.

   bitset<N>&
   operator|=(const bitset<N>& rhs);
      Sets each bit in *this for	which the corresponding	bit in rhs
      is set, and leaves	all other bits unchanged. Returns *this.

   bitset<N>&
   operator^=(const bitset<N>& rhs);
      Toggles each bit in *this for which the corresponding bit in
      rhs is set, and leaves all other bits unchanged. Returns *this.

   bitset<N>&
   operator<<=(size_t pos);
      Replaces each bit at position I with 0 if	I < pos	or with	the
      value of the bit at	I - pos	if I >=	pos. Returns *this.

   bitset<N>&
   operator>>=(size_t pos);
      Replaces each bit at position I with 0 if pos >= N-I or with
      the value of the bit at position I + pos if pos < N-I. Returns
      * this.

   bitset<N>&
   operator>>(size_t pos) const;
      Returns bitset<N>(*this) >>= pos.

   bitset<N>&
   operator<<(size_t pos) const;
      Returns bitset<N>(*this) <<= pos.

   bitset<N>
   operator~() const;
      Returns the bitset	that is	the logical complement of each bit
      in *this.

   bitset<N>
   operator&(const bitset<N>& lhs,
 	   const bitset<N>& rhs);
 	      lhs gets logical AND of lhs with rhs.

   bitset<N>
   operator|(const bitset<N>& lhs,
 	   const bitset<N>& rhs);
 	      lhs gets logical OR of lhs with rhs.

   bitset<N>
   operator^(const bitset<N>& lhs,
 	   const bitset<N>& rhs);
 	      lhs gets logical XOR of lhs with rhs.

   template <size_t N>
   istream&
   operator>>(istream& is, bitset<N>& x);
      Extracts up to N characters (single-byte) from is.	 Stores
      these characters in a temporary object str of type string, then
      evaluates the expression x = bitset<N>(str).  Characters are
      extracted and stored until any of the following occurs:

 	  - N characters have been extracted and stored
           - An end-of-file occurs on the input sequence
           - The next character is neither '0' nor '1'.  In this case,
             the character is not extracted.

      Returns is.

   template <size_t N>
   ostream&
   operator<<(ostream& os, const	bitset<N>& x);
      Returns os	<< x.to_string()

 MEMBER FUNCTIONS

   bool
   any()	const;
      Returns true if any bit in	*this is  set.	Otherwise returns
      false.

   size_t
   count() const;
      Returns a count of	the number of bits set in *this.

   bitset<N>&
   flip();
      Flips all bits in *this, and returns *this.

   bitset<N>&
   flip(size_t pos);
      Flips the bit at position pos in *this and	returns	*this. Throws
      an out_of_range exception if pos does not correspond to a valid
      bit position.

   bool
   none() const;
      Returns true if no	bit in *this is	set.   Otherwise returns false.

   bitset<N>&
   reset();
      Resets all	bits in	*this, and returns *this.

   bitset<N>&
   reset(size_t pos);
      Resets the	bit at position	pos in *this. Throws an	out_of_range
      exception if pos does not correspond to a valid bit position.

   bitset<N>&
   set();
      Sets all bits in *this, and returns *this.

   bitset<N>&
   set(size_t pos, int val = 1);
      Stores a new value	in the bits at position	pos in *this.  If
      val is nonzero, the stored value is one, otherwise it is zero.
      Throws an out_of_range exception if pos does not correspond to a
      valid bit position.

   size_t
   size() const;
      Returns the template parameter N.

   bool
   test(size_t pos) const;
      Returns true if the bit at	position pos is	set.  Throws an
      out_of_range exception if pos does not correspond to a valid
      bit position.

   string
   to_string() const;
      Returns an	object of type string, N characters long.

      Each position in the new string is	initialized with a character
      ('0' for zero and '1' for  one) representing the value stored in
      the corresponding bit position of *this. Character position N-1
      corresponds to bit position 0.  Subsequent decreasing character
      positions correspond to increasing	bit positions.

   unsigned long
   to_ulong() const;
      Returns the integral value	corresponding to the bits in *this.
      Throws an overflow_error if these bits cannot be represented
      as type unsigned long.

 SEE ALSO

   Containers

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  3 - deque

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   deque	 - A sequence that supports random access iterators and
   efficient insertion/deletion at both beginning and end.

 SYNOPSIS

   #include <deque>

   template <class T, class Allocator = allocator<T> >
   class	deque;

 DESCRIPTION

   deque<T, Allocator> is a type	of sequence that supports random
   access iterators.  It supports constant time	insert and erase
   operations at the beginning or the end of the container. Insertion
   and erase in	the middle take linear time.  Storage management
   is handled by the Allocator template parameter.

   Any type used	for the	template parameter T must provide the following
   (where T is the type,	t is a value of	T and u	is a const value of T):

   Default constructor	T()

   Copy constructors    T(t) and	T(u)

   Destructor   t.~T()

   Address of   &t and &u yielding T* and const T* respectively

   Assignment   t = a where a is	a (possibly const) value of T

 INTERFACE

   template <class T, class Allocator = allocator<T> >
   class	deque {

   public:

    // Types

     class iterator;
     class const_iterator;
     typedef T value_type;
     typedef Allocator allocator_type;
     typename  reference;
     typename  const_reference;
     typename  size_type;
     typename  difference_type;
     typename reverse_iterator;
     typename  const_reverse_iterator;

    // Construct/Copy/Destroy

     explicit deque (const Allocator& = Allocator());
     explicit deque (size_type, const Allocator&	= Allocator ());
     deque (size_type, const T& value,
 	   const Allocator& = Allocator	());
     deque (const deque<T,Allocator>&);
     template <class InputIterator>
      deque (InputIterator, InputIterator,
 	    const Allocator& = Allocator ());
      ~deque ();
     deque<T,Allocator>&	operator= (const deque<T,Allocator>&);
     template <class InputIterator>
      void assign (InputIterator, InputIterator);
     template <class Size, class	T>
      void assign (Size);
     template <class Size, class	T>
      void assign (Size,	const T&);
     allocator_type get allocator () const;

    // 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;

   // Capacity

     size_type size () const;
     size_type max_size () const;
     void resize	(size_type);
     void resize	(size_type, T);
     bool empty () const;

   // Element access

     reference operator[] (size_type);
     const_reference operator[] (size_type) const;
     reference at (size_type);
     const_reference at (size_type) const;
     reference front ();
     const_reference front () const;
     reference back ();
     const_reference back () const;

    // Modifiers

     void push_front (const T&);
     void push_back (const T&);
     iterator insert (iterator);
     iterator insert (iterator, const T&);
     void insert	(iterator, size_type, const T&);
     template <class InputIterator>
      void insert (iterator, InputIterator, InputIterator);

     void pop_front ();
     void pop_back ();

     iterator erase (iterator);
     iterator erase (iterator, iterator);
     void swap (deque<T,	Allocator>&);
     void clear();
   };

    // Non-member Operators

   template <class T, class Allocator>
   bool operator== (const deque<T, Allocator>&,
 		   const deque<T, Allocator>&);

   template <class T, class Allocator>
   bool operator!= (const deque<T, Allocator>&,
 		   const deque<T, Allocator>&);

   template <class T, class Allocator>
   bool operator< (const	deque<T, Allocator>&,
 		  const	deque<T, Allocator>&);

   template <class T, class Allocator>
   bool operator> (const	deque<T, Allocator>&,
 		  const	deque<T, Allocator>&);

   template <class T, class Allocator>
   bool operator<= (const deque<T, Allocator>&,
 		  const	deque<T, Allocator>&);

   template <class T, class Allocator>
   bool operator>= (const deque<T, Allocator>&,
 		  const	deque<T, Allocator>&);

   // Specialized Algorithms

   template <class T, class Allocator>
   voice	swap (deque<T, Allocator>&, deque<T, Allocator>&);

 CONSTRUCTORS AND DESTRUCTOR

   explicit
   deque(const Allocator& alloc = Allocator());
      The default constructor.  Creates a deque of zero elements. The
      deque will use the allocator alloc for all storage management.

   explicit
   deque(size_type n, const Allocator& alloc = Allocator());
      Creates a list of length n, containing n copies of	the default
      value for type T. Requires that T have a default constructor.
      The deque will use the allocator alloc for all storage
      management.

   deque(size_type n, const T& value,
 	const Allocator& alloc = Allocator());
 	   Creates a list of length n,	containing n copies of
            value. The deque will use the allocator alloc for all
            storage management.

   deque(const deque<T, Allocator>& x);
      Copy constructor. Creates a copy of x.

   template <class InputIterator>
   deque(InputIterator first, InputIterator last,
 	const Allocator& alloc = Allocator());
 	   Creates a deque of length last - first, filled with
            all values obtained  by dereferencing the InputIterators
            on the range [first, last). The deque will use the allocator
            alloc for all storage management.

   ~deque();
      The destructor.  Releases any allocated memory for	self.

 ALLOCATOR

   allocator
   allocator_type get_allocator() const;
      Returns a copy of the allocator used by self for storage management.

 ITERATORS

   iterator begin();
      Returns a random access iterator that points to the first element.

   const_iterator begin() const;

      Returns a constant	random access iterator that points to the first
      element.

   iterator end();
      Returns a random access iterator that points to the past-the-end
      value.

   const_iterator end() const;
      Returns a constant	random access iterator that points to the
      past-the-end value.

   reverse_iterator rbegin();
      Returns a random access reverse_iterator that points to the
      past-the-end value.

   const_reverse_iterator rbegin() const;
      Returns a constant	random access reverse iterator that points
      to the past-the-end value.

   reverse_iterator rend();
      Returns a random access reverse_iterator that points to the
      first element.

   const_reverse_iterator rend()	const;
      Returns a constant	random access reverse iterator that points
      to the first element.

 ASSIGNMENT OPERATOR

   deque<T, Allocator>&
   operator=(const deque<T, Allocator>& x);
      Erases all	elements in self then inserts into self	a copy of
      each element in x.	Returns	a reference to self.

 REFERENCE OPERATORS

   reference operator[](size_type n);
      Returns a reference to element n of self.	 The  result can
      be used as an lvalue. The index n must be between 0 and the
      size less one.

   const_reference operator[](size_type n) const;
      Returns a constant	reference to element n of self.	 The index
      n must be between 0 and the size() -1.

 MEMBER FUNCTIONS

   template <class InputIterator>
   void
   assign(InputIterator first, InputIterator last);
      Erases all	elements contained in self, then inserts new elements
      from the range [first, last).

   template <class Size,	class T>
   void
   assign(Size n);
      Erases all	elements contained in self, then inserts n instances
      of	the default value of type T.

   template <class Size,	class T>
   void
   assign(Size n, const T& t);
      Erases all	elements contained in self, then inserts n instances
      of	the value of t.

   reference
   at(size_type n);
      Returns a reference to element n of self.	The  result can	be
      used as an lvalue.  The index n must be between 0 and the
      size() - 1.

   const_reference
   at(size_type)	const;
      Returns a constant	reference to element n of self.	 The index n
      must be between 0 and the size() -	1.

   reference
   back();
      Returns a reference to the	last element.

   const_reference
   back() const;
      Returns a constant	reference to the last element.

   void
   clear();
      Erases all	elements from the self.

   bool
   empty() const;
      Returns true if the size of self is zero.

   reference
   front();
      Returns a reference to the	first element.

   const_reference
   front() const;
      Returns a constant	reference to the first element.

   iterator
   erase(iterator first,	iterator last);
      Deletes the elements in the range (first, last). Returns an
      iterator pointing to the element following the last deleted
      element, or end() if there were no elements after the deleted
      range.

   iterator
   erase(iterator position);
      Removes the element pointed to by position. Returns an iterator
      pointing to the element following the deleted element, or end()
      if there were no elements after the deleted range.

   iterator
   insert(iterator position);
      Inserts a copy of the default value of type T before position.
      The return value points to the inserted element.  Requires that
      type T have a default constructor.

   iterator
   insert(iterator position, const T& x);
      Inserts x before position.	 The return value points to the
      inserted x.

   void
   insert(iterator position, size_type n, const T& x);
      Inserts n copies of x before position.

   template <class InputIterator>
   void
   insert(iterator position, InputIterator first,
 	 InputIterator last);
 	    Inserts copies of the elements in the range	(first,	last]
             before position.

   size_type
   max_size() const;
      Returns size() of the largest possible deque.

   void
   pop_back();
      Removes the last element.	Note that this function	does not return
      the element.

   void
   pop_front();
      Removes the first element.	 Note that this	function does not return
      the element

   void
   push_back(const T& x);
      Appends a copy of x to the	end.

   void
   push_front(const T& x);
      Inserts a copy of x at the	front.

   void
   resize(size_type sz);
      Alters the	size of	self.  If the new size (sz) is greater than
      the current size then sz-size() copies	of the default value
      of	type T  are inserted at the end of the	deque. If the new size
      is smaller  than the current capacity, then the deque is
      truncated by erasing  size()-sz	elements off the end.
      Otherwise, no action is	taken.  Requires that type T have a
      default constructor.

   void
   resize(size_type sz, T c);
      Alters the	size of	self.  If the new size (sz) is greater than
      the current size then sz-size() c's are  inserted at the end of
      the  deque.  If	the new	size is	smaller	than the current
      capacity, then	the deque is truncated by erasing size()-sz
      elements off the end.  Otherwise, no action is taken.

   size_type
   size() const;
      Returns the number	of elements.

   void
   swap(deque<T,Allocator>& x);
      Exchanges self with x.

 NON-MEMBER FUNCTIONS

   template <class T, class Allocator>
   bool operator==(const	deque<T, Allocator>& x,
 		  const	deque<T, Allocator>& y);
 		     Equality operator.	Returns	true if	x is the same
                      as y.

   template <class T, class Allocator>
   bool operator!=(const	deque<T, Allocator>& x,
 		  const	deque<T, Allocator>& y);
 		     Inequality	operator. Returns true if x is not the
                      same as y.

   template <class T, class Allocator>
   bool operator<(const deque<T,	Allocator>& x,
 		 const deque<T,	Allocator>& y);
 		    Returns true if the	elements contained in x	are
                     lexicographically less than the elements contained
                     in y.

   template <class T, class Allocator>
   bool operator>(const deque<T,	Allocator>& x,
 		 const deque<T,	Allocator>& y);
 		    Returns true if the	elements contained in x	are lexico-
 		    graphically	greater	than the elements contained in y.

   template <class T, class Allocator>
   bool operator<=(const	deque<T, Allocator>& x,
 		 const deque<T,	Allocator>& y);
 		    Returns true if the	elements contained in x	are lexico-
 		    graphically	less than or equal to the elements contained
 		    in y.

   template <class T, class Allocator>
   bool operator>=(const	deque<T, Allocator>& x,
 		 const deque<T,	Allocator>& y);
 		    Returns true if the	elements contained in x	are lexico-
 		    graphically	greater	 than or equal to the elements con-
 		    tained in y.

   template <class T, class Allocator>
   bool operator<(const deque<T,	Allocator>& x,
 		 const deque<T,	Allocator>& y);
 		    Returns true if the	elements contained in x	are lexico-
 		    graphically	less than the elements contained in y.

 SPECIALIZED ALGORITHMS

   template <class T, class Allocator>
   void swap(deque<T, Allocator>& a, deque<T, Allocator>& b);
      Efficiently swaps the contents of a and b.

 EXAMPLE

   //
   // deque.cpp
   //
    #include <deque>
    #include <string>

   deque<string,	allocator> deck_of_cards;
   deque<string,	allocator> current_hand;

   void initialize_cards(deque<string, allocator>& cards) {
     cards.push_front("aceofspades");
     cards.push_front("kingofspades");
     cards.push_front("queenofspades");
     cards.push_front("jackofspades");
     cards.push_front("tenofspades");
      //	etc.
    }

   template <class It, class It2>
   void print_current_hand(It start, It2	end)
    {
     while (start < end)
     cout << *start++ <<	endl;
    }

   template <class It, class It2>
   void deal_cards(It, It2 end) {
     for	(int i=0;i<5;i++) {
       current_hand.insert(current_hand.begin(),*end);
       deck_of_cards.erase(end++);
      }
    }

   void play_poker() {
     initialize_cards(deck_of_cards);
     deal_cards(current_hand.begin(),deck_of_cards.begin());
    }

   int main()
    {
     play_poker();
     print_current_hand(current_hand.begin(),current_hand.end());
     return 0;
    }

   Output :
   aceofspades
   kingofspades
   queenofspades
   jackofspades
   tenofspades

 WARNINGS

   Member function templates are	used in	all containers provided	by the
   Standard C++ Library.	 An example of this is the constructor for
   deque<T,Allocator> that takes	two templated iterators:

   template <class InputIterator>
   deque	(InputIterator,	InputIterator);

   deque	also has an insert function of this type. These	functions,
   when	not restricted by compiler limitations, allow you to use any
   type	of input iterator as arguments.  For compilers	that do	not
   support this feature we provide substitute functions that allow you
   to use an iterator obtained from the same type of container as the one
   you are constructing (or calling a member function on), or you
   can use a pointer to the type of element you have in the container.

   For example, if your compiler	does not support member	function
   templates you can construct a deque in the following two ways:

   int intarray[10];
   deque<int> first_deque(intarray, intarray + 10);
   deque<int> second_deque(first_deque.begin(),
 			 first_deque.end());

   But not this way:

   deque<long> long_deque(first_deque.begin(),
 				   first_deque.end());

   since	the long_deque and first_deque are not the same	type.

   Additionally,	many compilers do not support default template arguments.
   If your compiler is one of these, you need to always supply the
   Allocator template argument.  For instance, you'll have to write:

   deque<int, allocator<int> >

      instead of:

   deque<int>

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  4 - list

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   list	- A sequence that supports bidirectional iterators

 SYNOPSIS

   #include <list>

   template <class T, class Allocator = allocator<T> >
   class	list;

 DESCRIPTION

   list<T,Allocator> is a type of sequence that supports	bidirectional
   iterators.	 A list<T,Allocator> allows constant time insert and
   erase operations anywhere within the sequence, with storage
   management handled automatically. Constant time random access is
   not supported.

   Any type used	for the	template parameter T must provide  the
   following (where T is the type,	t is a value of	T and u	is a
   const value of T):

    Default constructor	 T()
    Copy	constructors	 T(t) and T(u)
    Destructor		 t.~T()
    Address of		 &t and	&u yielding T* and
 			  const	T* respectively
    Assignment		 t = a where a is a
 			   (possibly const) value of T

 INTERFACE

   template <class T, class Allocator = allocator<T> >
   class	list {

   public:

   // typedefs

     class iterator;
     class const_iterator;
     typename reference;
     typename const_reference;
     typename size_type;
     typename difference_type;
     typedef T value_type;
     typedef Allocator allocator_type;

     typename reverse_iterator;
     typename const_reverse_iterator;

   // Construct/Copy/Destroy

     explicit list (const Allocator& = Allocator());
     explicit list (size_type, const Allocator& = Allocator());
     list (size_type, const T&, const Allocator&	= Allocator())
     template <class InputIterator>
     list (InputIterator, InputIterator,
 	  const	Allocator& = Allocator());
     list(const list<T, Allocator>& x);
      ~list();
     list<T,Allocator>& operator= (const	list<T,Allocator>&);
     template <class InputIterator>
      void assign (InputIterator, InputIterator);
     template <class Size, class	T>
      void assign (Size n);
     template <class Size, class	T>
      void assign (Size n, const	T&);

     allocator_type get allocator () const;

   // 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;

   // Capacity

     bool empty () const;
     size_type size () const;
     size_type max_size () const;
     void resize	(size_type);
     void resize	 (size_type, T);

   // Element Access

     reference front ();
     const_reference front () const;
     reference back ();
     const_reference back () const;

   // Modifiers

     void push_front (const T&);
     void pop_front ();
     void push_back (const T&);
     void pop_back ();

     iterator insert (iterator);
     iterator insert (iterator, const T&);
     void insert	(iterator, size_type, const T&);
     template <class InputIterator>
      void insert  (iterator, InputIterator, InputIterator);

     iterator erase (iterator);
     iterator erase (iterator, iterator);

     void swap (list<T, Allocator>&);
     void clear ();

   // Special mutative operations on list

     void splice	(iterator, list<T, Allocator>&);
     void splice	(iterator, list<T, Allocator>&,	iterator);
     void splice	(iterator, list<T, Allocator>&,	iterator, iterator);

     void remove	(const T&);
     template <class Predicate>
      void remove_if (Predicate);

     void unique	();
     template <class BinaryPredicate>
      void unique (BinaryPredicate);

     void merge (list<T,	Allocator>&);
     template <class Compare>
      void merge	(list<T, Allocator>&, Compare);

     void sort ();
     template <class Compare>
      void sort (Compare);

     void reverse();
   };

   // Non-member	List Operators

   template <class T, class Allocator>
   bool operator== (const list<T, Allocator>&,
 		   const list<T, Allocator>&);

   template <class T, class Allocator>
   bool operator!= (const list<T, Allocator>&,
 		   const list<T, Allocator>&);

   template <class T, class Allocator>
   bool operator< (const	list<T,	Allocator>&,
 		  const	list<T,	Allocator>&);

   template <class T, class Allocator>
   bool operator> (const	list<T,	Allocator>&,
 		  const	list<T,	Allocator>&);

   template <class T, class Allocator>
   bool operator<= (const list<T, Allocator>&,
 		  const	list<T,	Allocator>&);

   template <class T, class Allocator>
   bool operator>= (const list<T, Allocator>&,
 		  const	list<T,	Allocator>&);

   // Specialized Algorithms

   template <class T, class Allocator>
   void swap (list<T,Allocator>&, list<T, Allocator>&);

 CONSTRUCTORS AND DESTRUCTORS

   explicit list(const Allocator& alloc = Allocator());
      Creates a list of zero elements. The list will use	the allocator
      alloc for all storage management.

   explicit list(size_type n,
 		const Allocator& alloc = Allocator());
 		   Creates a list of length n, containing n copies of the
 		   default value for type T. Requires that T have a default
 		   constructor.	The list will use the allocator	alloc for
                    all storage management.

   list(size_type n, const T& value,
        const Allocator&	alloc =	Allocator());
 	  Creates a list of length n, containing n copies of value. The
           list will use the allocator alloc for all storage management.

   template <class InputIterator>
   list(InputIterator first, InputIterator last,
        const Allocator&	alloc =	Allocator());
 	  Creates a list of length last	- first, filled	with all values
 	  obtained by dereferencing the	InputIterators on the range [first,
 	  last). The list will use the allocator alloc for all storage
 	  management.

   list(const list<T, Allocator>& x);
      Copy constructor.	Creates	a copy of x.

   ~list();
      The destructor. Releases any allocated memory for this list.

 ASSIGNMENT OPERATOR

   list<T, Allocator>&
   operator=(const list<T, Allocator>& x)
      Erases all	elements in self then inserts into self	a copy of each
      element in x. Returns a reference to *this.

 ALLOCATOR

   allocator_type
   get_allocator() const;
      Returns a copy of the allocator used by self for storage management.

 ITERATORS

   iterator
   begin();
      Returns a bidirectional iterator that points to the first element.

   const_iterator
   begin() const;
      Returns a constant	bidirectional iterator that points to the first
      element.

   iterator
   end();
      Returns a bidirectional iterator that points to the past-the-end
      value.

   const_iterator
   end()	const;
      Returns a constant	bidirectional iterator	that  points to	the
      past-the-end value.

   reverse_iterator
   rbegin();
      Returns a bidirectional iterator that points to the past-the-end
      value.

   const_reverse_iterator
   rbegin() const;
      Returns a constant	bidirectional iterator that points to the
      past-the-end value.

   reverse_iterator
   rend();
      Returns a bidirectional iterator that points to the first element.

   const_reverse_iterator
   rend() const;
      Returns a constant	bidirectional iterator that  points to the first
      element.

 MEMBER FUNCTIONS

   template <class InputIterator>
   void
   assign(InputIterator first, InputIterator last);
      Erases all	elements contained in self, then inserts new elements
      from the range [first, last).

   template <class Size,	class T>
   void
   assign(Size n);
      Erases all	elements contained in self, then inserts n instances of
      the default value of t.

   template <class Size,	class T>
   void
   assign(Size n, const T& t);
      Erases all	elements contained in self, then inserts n instances of
      the value of t.

   reference
   back();
      Returns a reference to the	last element.

   const_reference
   back() const;
      Returns a constant	reference to the last element.

   void
   clear();
      Erases all	elements from the list.

   bool
   empty() const;
      Returns true if the size is zero.

   iterator
   erase(iterator position);
      Removes the element pointed to by position. Returns an iterator
      pointing to the element following the deleted element, or end() if
      the deleted item was the last one in this list.

   iterator
   erase(iterator first,	iterator last);
      Removes the elements in the range (first, last). Returns an
      iterator pointing to the element following the element following
      the last  deleted element, or end() if there	were no
      elements after the deleted  range.

   reference
   front();
      Returns a reference to the	first element.

   const_reference
   front() const;
      Returns a constant	reference to the first element.

   iterator
   insert(iterator position);
      Inserts a copy of the default value for type T before position.
      Returns an	iterator that points to	the inserted value. Requires
      that  type T have a default constructor.

   iterator
   insert(iterator position, const T& x);
      Inserts x before position.	 Returns an iterator that points to the
      inserted x.

   void
   insert(iterator position, size_type n, const T& x);
      Inserts n copies of x before position.

   template <class InputIterator>
   void
   insert(iterator position, InputIterator first,
 	 InputIterator last);
 	    Inserts copies of the elements in the range	[first,	last)
             before position.

   size_type
   max_size() const;
      Returns size() of the largest possible list.

   void merge(list<T, Allocator>& x);
      Merges a sorted x with a sorted self using	operator<.  For	equal
      elements in the two lists, elements from self will always precede
      the elements from	x.  The	merge function leaves x	empty.

   template <class Compare>
   void
   merge(list<T,	Allocator>& x, Compare comp);
      Merges a sorted x with sorted self	using a	 compare function
      object,comp.  For	same elements in the two lists,	elements from
      self will always precede the elements from x.  The merge function
      leaves x empty.

   void
   pop_back();
      Removes the last element.

   void
   pop_front();
      Removes the first element.

   void
   push_back(const T& x);
      Appends a copy of x to the	end of the list.

   void
   push_front(const T& x);
      Appends a copy of x to the	front of the list.

   void
   remove(const T& value);
   template <class Predicate>
   void
   remove_if(Predicate pred);
      Removes all elements in the list referred by the list iterator i
      for which *i == value or pred(*i) == true, whichever is applicable.
      This is a stable operation, the relative order of list items  that
      are not removed is	preserved.

   void
   resize(size_type sz);
      Alters the	size of	self.  If the new size ( sz ) is greater than
      the current size, sz-size() copies of the default value of type T
      are inserted at the end of the list.  If the new size is smaller
      than  the current capacity, then the list is truncated by erasing
      size()-sz  elements off the end. Otherwise,  no action is taken.
      Requires that type T have a default constructor.

   void
   resize(size_type sz, T c);
      Alters the	size of	self.  If the new size ( sz ) is greater than
      the current size, sz-size() c's are inserted at the end of the
      list.  If the new size is smaller than the current capacity, then
      the list is truncated by erasing size()-sz elements off the end.
      Otherwise,  no action is taken.

   void
   reverse();
      Reverses the order	of the elements.

   size_type
   size() const;
      Returns the number	of elements.

   void
   sort();
      Sorts self	according to the  operator<.  sort  maintains the
      relative order of equal elements.

   template <class Compare>
   void
   sort(Compare comp);
      Sorts self	according to a comparison function object, comp.
      This is also a stable sort.

   void
   splice(iterator position, list<T, Allocator>&	x);
      Inserts x before position leaving x empty.

   void
   splice(iterator position, list<T, Allocator>&	 x, iterator i);
      Moves the elements	pointed	to by iterator i in x to self,
      inserting  it before position.  The element is removed from x.

   void
   splice(iterator position, list<T, Allocator >&  x,
 	 iterator first, iterator last);
      Moves the elements in the range [first, last) in x to self,
      inserting before position.	The elements in	 the range
      [first,last) are removed from x.

   void
   swap(list <T,	Allocator>& x);
      Exchanges self with x.

   void
   unique();
      Erases copies of consecutive repeated elements leaving the	first
      occurrence.

   template <class BinaryPredicate>
   void
   unique(BinaryPredicate binary_pred);
      Erases consecutive	elements matching a true condition of the
      binary_pred.  The first occurrence	is not removed.

 NON-MEMBER OPERATORS

   template <class T, class Allocator>
   bool operator==(const	list<T,	Allocator>& x,
 		  const	list<T,	Allocator>& y);
      Equality operator.	Returns	true if	x is the same  as y.

   template <class T, class Allocator>
   bool operator!=(const	list<T,	Allocator>& x,
 		  const	list<T,	Allocator>& y);
      Inequality	operator. Returns !(x==y).

   template <class T, class Allocator>
   bool operator<(const list<T, Allocator>& x,
 		 const list<T,Allocator>& y);
      Returns true if the	sequence defined by the	elements
      contained in x is lexicographically less than the  sequence
      defined by the elements contained in y.

   template <class T, class Allocator>
   bool operator>(const list<T, Allocator>& x,
 		 const list<T,Allocator>& y);
 		    Returns y <	x.

   template <class T, class Allocator>
   bool operator<=(const	list<T,	Allocator>& x,
 		 const list<T,Allocator>& y);
 		    Returns !(y	< x).

   template <class T, class Allocator>
   bool operator>=(const	list<T,	Allocator>& x,
 		 const list<T,Allocator>& y);
 		    Returns !(x	< y).

 SPECIALIZED ALGORITHMS

   template <class T, class Allocator>
   void swap(list<T, Allocator>&	a, list<T, Allocator>& b);
      Efficiently swaps the contents of a and b.

 EXAMPLE

   //
   // list.cpp
   //
    #include <list>
    #include <string>
    #include <iostream.h>
    // Print out	a list of strings
   ostream& operator<<(ostream& out, const list<string>&	l)
    {
     copy(l.begin(), l.end(),
 	 ostream_iterator<string,char>(cout," "));
     return out;
    }
   int main(void)
    {
      //	create a list of critters
     list<string> critters;
     int	i;
      //	insert several critters
     critters.insert(critters.begin(),"antelope");
     critters.insert(critters.begin(),"bear");
     critters.insert(critters.begin(),"cat");

      //	print out the list
     cout << critters <<	endl;

      //	Change cat to cougar
      *find(critters.begin(),critters.end(),"cat") = "cougar";
     cout << critters <<	endl;

      //	put a zebra at the beginning
      //	an ocelot ahead	of antelope
      //	and a rat at the end
     critters.push_front("zebra");
     critters.insert(find(critters.begin(),critters.end(),
 		     "antelope"),"ocelot");
     critters.push_back("rat");
     cout << critters <<	endl;

      //	sort the list (Use list's sort function	since the
      //	generic	algorithm requires a random access iterator
      //	and list only provides bidirectional)
     critters.sort();
     cout << critters <<	endl;

      //	now let's erase	half of	the critters
     int	half = critters.size() >> 1;
     for(i = 0; i < half; ++i) {
       critters.erase(critters.begin());
      }
     cout << critters <<	endl;
     return 0;
    }

   Output :
   cat bear antelope
   cougar bear antelope
   zebra	cougar bear ocelot antelope rat
   antelope bear	cougar ocelot rat zebra
   ocelot  rat zebra

 WARNINGS

   Member function templates are	used in	all containers provided	by the
   Standard C++ Library.  An example of this feature is the constructor
   for list<T, Allocator> that takes two templated iterators:

   template <class InputIterator>
   list (InputIterator, InputIterator,
        const Allocator&	= Allocator());

   list also has	an insert function of this type.  These	functions,
   when	not restricted by compiler limitations, allow you to use any
   type	of input iterator as arguments.  For compilers	that do	not
   support this feature, we provide substitute functions that allow you
   to use an iterator obtained from the same type of container as the
   one  you are constructing (or calling a member function on), or you
   can  use a pointer to the type of element you have in the container.

   For example, if your compiler	does not support member	 function
   templates you can construct a list in the following two ways:

   int intarray[10];
   list<int> first_list(intarray,intarray + 10);
   list<int> second_list(first_list.begin(),first_list.end());

   But not this way:

   list<long> long_list(first_list.begin(),first_list.end());

   since	the long_list and first_list are not the same type.

   Additionally,	list provides a	merge function of this type.

   template <class Compare> void	merge (list<T, Allocator>&,
    Compare);

   This function	allows you to specify a	compare	function object	to
   be used in merging two lists.  In this case, we were unable to
   provide a substitute function in addition to the merge that uses
   the operator< as the default. Thus,	if your	compiler does not
   support member function templates, all list mergers will use
   operator<.

   Also,	many compilers do not support default template arguments.
   If your compiler is one of these, you	need to	always supply the
   Allocator template argument. For instance, you'll have to write:

   list<int, allocator<int> >

   instead of:

   list<int>

 SEE ALSO

   allocator, Containers, Iterators

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  5 - map

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   map  - An associative	container providing access to non-key values
   using unique keys.	A map supports bidirectional iterators.

 SYNOPSIS

   #include <map>

   template <class Key, class T,	class Compare =	less<Key>
 	   class Allocator = allocator<T> >
   class	map;

 DESCRIPTION

   map <Key, T, Compare,	Allocator> provides fast access	to stored
   values of type T  which are indexed by unique keys of type Key.
   The default operation for key comparison is the < operator.

   map provides bidirectional iterators	that point to an instance of
   pair<const Key x, T y> where x is the	key and	y is the stored	value
   associated with that key.  The definition of map provides a typedef
   to this pair called value_type.

   The types used for both the template parameters  Key	and T must
   provide the following	(where T is the	type, t	is a value of T	and
   u is a const value of T):

    Copy	constructors -	T(t) and T(u)
    Destructor	     -	t.~T()
    Address of	     -	&t and &u yielding T* and
 			const T* respectively
    Assignment	     -	t = a where a is a
 			 (possibly const) value	of T

   The type used	for the	Compare	template parameter must	satisfy	the
   requirements	for binary functions.

 INTERFACE

   template <class Key, class T,	class Compare =	less<Key>
 	   class Allocator = allocator<T> >
   class	map {

   public:

   // types

     typedef Key	key_type;
     typedef T mapped_type;
     typedef pair<const Key, T> value_type;
     typedef Compare key_compare;
     typedef Allocator allocator_type;
     typename reference;
     typename const_reference;
     typename iterator;
     typename const_iterator;
     typename size_type;
     typename difference_type;
     typename reverse_iterator;
     typename const_reverse_iterator;

     class value_compare
 	: public binary_function<value_type, value_type, bool>
      {
       friend class map<Key, T, Compare,	Allocator>;

       public :
 	bool operator()	(const value_type&,
 			 const value_type&) const;
      };

   // Construct/Copy/Destroy

     explicit map (const	Compare& = Compare(),
 		  const	Allocator& = Allocator ());
     template <class InputIterator>
      map (InputIterator, InputIterator,
 	  const	Compare& = Compare(),
 	  const	Allocator& = Allocator ());
     map	(const map<Key,	T, Compare, Allocator>&);
      ~map();
     map<Key, T,	Compare, Allocator>&
      operator= (const map<Key, T, Compare, Allocator>&);
     allocator_type get_allocator () const;

   // 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;

   // Capacity

     bool empty() const;
     size_type size() const;
     size_type max_size() const;

   // Element Access

     mapped_type& operator[] (const key_type&);
     const mapped_type& operator[] (const key_type&) const;

   // Modifiers

     pair<iterator, bool> insert	(const value_type&);
     iterator insert (iterator, const value_type&);
     template <class InputIterator>
      void insert (InputIterator, InputIterator);

     iterator erase (iterator);
     size_type erase (const key_type&);
     iterator erase (iterator, iterator);
     void swap (map<Key,	T, Compare, Allocator>&);

   // Observers

     key_compare	key_comp() const;
     value_compare value_comp() const;

   // Map operations

     iterator find (const key_value&);
     const_iterator find	(const key_value&) const;
     size_type count (const key_type&) const;
     iterator lower_bound (const	key_type&);
     const_iterator lower_bound (const key_type&) const;
     iterator upper_bound (const	key_type&);
     const_iterator upper_bound (const key_type&) const;
     pair<iterator, iterator> equal_range (const	key_type&);
     pair<const_iterator, const_iterator>
       equal_range (const key_type&) const;
   };

   // Non-member	Map Operators

   template <class Key, class T,	class Compare, class Allocator>
    bool	operator== (const map<Key, T, Compare, Allocator>&,
 		   const map<Key, T, Compare, Allocator>&);

   template <class Key, class T,	class Compare, class Allocator>
    bool	operator!= (const map<Key, T, Compare, Allocator>&,
 		   const map<Key, T, Compare, Allocator>&);

   template <class Key, class T,	class Compare, class Allocator>
   bool operator< (const	map<Key, T, Compare, Allocator>&,
 		  const	map<Key, T, Compare, Allocator>&);

   template <class Key, class T,	class Compare, class Allocator>
   bool operator> (const	map<Key, T, Compare, Allocator>&,
 		  const	map<Key, T, Compare, Allocator>&);

   template <class Key, class T,	class Compare, class Allocator>
   bool operator<= (const map<Key, T, Compare, Allocator>&,
 		  const	map<Key, T, Compare, Allocator>&);

   template <class Key, class T,	class Compare, class Allocator>
   bool operator>= (const map<Key, T, Compare, Allocator>&,
 		  const	map<Key, T, Compare, Allocator>&);

   // Specialized Algorithms

   template <class Key, class T,	class Compare, class Allocator>
   void swap (map<*Key,T,Compare,Allocator>&,
 	     map<Key,T,Compare,Allocator>&);

 CONSTRUCTORS AND DESTRUCTORS

   explicit map(const Compare& comp = Compare(),
 	      const Allocator& alloc = Allocator());
 		 Default constructor.  Constructs an empty map that
                  will use the relation comp to order keys, if it
                  is supplied.  The map will use the allocator alloc for
                  all storage management.

   template <class InputIterator>
   map(InputIterator first, InputIterator last,
      const Compare& comp = Compare(),
      const Allocator& alloc = Allocator());
 	Constructs a map containing values in the range	[first,	last).
         Creation of the new map is only guaranteed to succeed if
         the iterators first and  last return values of type
         pair<class Key, class Value> and all values of Key in the
         range[first, last) are unique. The map will use the relation
         comp to order keys, and the allocator alloc for all storage
         management.

   map(const map<Key,T,Compare,Allocator>& x);
      Copy constructor.	Creates	a new map by copying all pairs of key
      and value from x.

   ~map();
      The destructor.  Releases any allocated memory for	this map.

 ALLOCATOR

   allocator_type get_allocator() const;
      Returns a copy of the allocator used by self for storage management.

 ITERATORS

   iterator
   begin() ;
      Returns an	iterator pointing to the first element stored in the
      map. "First" is	defined	by the map's comparison	operator,
      Compare.

   const_iterator
   begin() const;
      Returns a const_iterator pointing to the first element stored in
      the map.

   iterator
   end()	;
      Returns an	iterator pointing to the last element  stored in the
      map, i.e., the off-the-end value.

   const_iterator
   end()	const;
      Returns a const_iterator pointing to the last element stored in
      the  map.

   reverse_iterator
   rbegin();
      Returns a reverse_iterator	pointing to the	first element stored
      in	the map.  "First" is defined by the map's comparison operator,
      Compare.

   const_reverse_iterator
   rbegin() const;
      Returns a const_reverse_iterator pointing to the  first element
      stored in	the map.

   reverse_iterator
   rend() ;
      Returns a reverse_iterator	pointing to the	last element stored
      in the map, i.e.,	the off-the-end	value.

   const_reverse_iterator
   rend() const;
      Returns a const_reverse_iterator pointing to the last element
      stored  in the map.

 MEMBER OPERATORS

   map<Key, T, Compare, Allocator>&
   operator=(const map<Key, T, Compare, Allocator>& x);
      Assignment.  Replaces the contents	of *this with a	copy of	the
      map	x.

   mapped_type&
   operator[](const key_type& x);
      If	an element with	the key	x exists in the	map, then a reference
      to  its associated value will be returned. Otherwise the pair
      x,T() will  be inserted into the map and a reference to the
      default object T()  will be returned.

 ALLOCATOR

   allocator_type
   get_allocator() const;
      Returns a copy of the allocator used by self for storage
      management.

 MEMBER FUNCTIONS

   void
   clear();
      Erases all	elements from the self.

   size_type
   count(const key_type&	x) const;
      Returns a 1 if a value with the key x exists in  the map,
      otherwise returns a 0.

   bool
   empty() const;
      Returns true if the map is	empty, false otherwise.

   pair<iterator, iterator>
   equal_range (const  key_type&	x);
      Returns the pair, (lower_bound(x),	upper_bound(x)).

   pair<const_iterator,const_iterator>
   equal_range(const key_type& x) const;
      Returns the pair, (lower_bound(x),	upper_bound(x)).

   iterator
   erase(iterator position);
      Deletes the map element pointed to	by the iterator	position.
      Returns an iterator pointing to the element following the deleted
      element, or end() if the deleted item was the last one in this
      list.

   iterator
   erase(iterator first,	iterator last);
      Providing the iterators first and last point to the same map and
      last is reachable from first, all elements	in the range  (first,
      last) will	be deleted from the map. Returns an iterator  pointing
      to the element following the last deleted element, or  end() if
      there were no elements after the deleted range.

   size_type
   erase(const key_type&	x);
      Deletes the element with the key value x from the map, if one
      exists. Returns 1 if x existed  in	the map, 0 otherwise.

   iterator
   find(const key_type& x);
      Searches the map for a pair with the key value x and returns an
      iterator to that pair if it is found.  If such  a  pair
      is not found  the value end() is returned.

   const_iterator find(const key_type& x) const;
      Same as find above	but returns a const_iterator.

   pair<iterator, bool>
   insert(const value_type& x);
   iterator
   insert(iterator position, const value_type& x);
      If	a value_type with the same key as  x  is  not present in the
      map, then x is inserted into the map. Otherwise, the pair is not
      inserted. A position may be supplied as a hint regarding where
      to do the insertion. If the insertion may be done right after
      position then it takes  amortized  constant time.  Otherwise it
      will take O(log N) time.

   template <class InputIterator>
   void
   insert(InputIterator first, InputIterator last);
      Copies of each element in the range [first, last) which  possess
      a unique key, one not already in the	map, will be inserted
      into the map. The  iterators first and last must	return values
      of type pair<T1,T2>. This  operation takes approximately
      O(N*log(size()+N)) time.

   key_compare
   key_comp() const;
      Returns a function	object capable of comparing key	values using
      the comparison operation,	Compare, of the	current	map.

   iterator
   lower_bound(const key_type& x);
      Returns a reference to the	first entry with a key greater than
      or equal to x.

   const_iterator
   lower_bound(const key_type& x) const;
      Same as  lower_bound above	but returns a const_iterator.

   size_type
   max_size() const;
      Returns the maximum possible size of the map.   This size is only
      constrained by the number of unique keys which can be represented
      by the type Key.

   size_type
   size() const;
      Returns the number	of elements in the map.

   void
   swap(map<Key,	T, Compare, Allocator>&	x);
      Swaps the contents	of the map x with the current map, *this.

   iterator
   upper_bound(const key_type& x);
      Returns a reference to the	first entry with a key less than or
      equal to x.

   const_iterator
   upper_bound(const key_type& x) const;
      Same as upper_bound above but returns a const_iterator.

   value_compare
   value_comp() const;
      Returns a function	object	capable	of comparing pair<const	Key,
      T> values using the comparison operation, Compare, of	the
      current map. This function is identical	to key_comp for	sets.

 NON-MEMBER OPERATORS

   template <class Key, class T,	class Compare, class Allocator>
   bool operator==(const	map<Key, T, Compare, Allocator>& x,
 		  const	map<Key, T, Compare, Allocator>& y);
 		     Returns true if all elements in x are element-wise
                      equal to all elements in y, using (T::operator==).
                      Otherwise it returns false.

   template <class Key, class T,	class Compare, class Allocator>
   bool operator!=(const	map<Key, T, Compare, Allocator>& x,
 		  const	map<Key, T, Compare, Allocator>& y);
 		     Returns !(x==y).

   template <class Key, class T,	class Compare, class Allocator>
   bool operator<(const map<Key,	T, Compare, Allocator>&	x,
 		 const map<Key,	T, Compare, Allocator>&	y);
 		    Returns true if x is lexicographically less	than y.
                     Otherwise, it returns false.

   template <class Key, class T,	class Compare, class Allocator>
   bool operator>(const map<Key,	T, Compare, Allocator>&	x,
 		 const map<Key,	T, Compare, Allocator>&	y);
 		    Returns y <	x.

   template <class Key, class T,	class Compare, class Allocator>
   bool operator<=(const	map<Key, T, Compare, Allocator>& x,
 		 const map<Key,	T, Compare, Allocator>&	y);
 		    Returns !(y	< x).

   template <class Key, class T,	class Compare, class Allocator>
   bool operator>=(const	map<Key, T, Compare, Allocator>& x,
 		 const map<Key,	T, Compare, Allocator>&	y);
 		    Returns !(x	< y).

 SPECIALIZED ALGORITHMS

   template <class Key, class T,	class Compare, class Allocator>
   void swap(map<Key, T,	Compare, Allocator>& a,
 	    map<Key, T,	Compare, Allocator>& b);
 	       Efficiently swaps the contents of a and b.

 EXAMPLE

   //
   // map.cpp
   //
    #include <string>
    #include <map>
    #include <iostream.h>

   typedef map<string, int, less<string>	> months_type;

    // Print out	a pair
   template <class First, class Second>
   ostream& operator<<(ostream& out,
 		      const pair<First,Second> & p)
    {
     cout << p.first << " has " << p.second << "	days";
     return out;
    }

    // Print out	a map
   ostream& operator<<(ostream& out, const months_type &	l)
    {
     copy(l.begin(),l.end(), ostream_iterator
 		  <months_type::value_type,char>(cout,"0));
     return out;
    }

   int main(void)
    {
      //	create a map of	months and the number of days
      //	in the month
     months_type	months;

     typedef months_type::value_type value_type;

      //	Put the	months in the multimap
     months.insert(value_type(string("January"),	  31));
     months.insert(value_type(string("February"),   28));
     months.insert(value_type(string("February"),   29));
     months.insert(value_type(string("March"),	  31));
     months.insert(value_type(string("April"),	  30));
     months.insert(value_type(string("May"),	  31));
     months.insert(value_type(string("June"),	  30));
     months.insert(value_type(string("July"),	  31));
     months.insert(value_type(string("August"),	  31));
     months.insert(value_type(string("September"), 30));
     months.insert(value_type(string("October"),	  31));
     months.insert(value_type(string("November"),  30));
     months.insert(value_type(string("December"),  31));

      //	print out the months
      //	Second February	is not present
     cout << months << endl;

      //	Find the Number	of days	in June
     months_type::iterator p = months.find(string("June"));

      //	print out the number of	days in	June
     if (p != months.end())
       cout << endl << *p << endl;

     return 0;
    }

   Output :
   April	has 30 days
   August has 31	days
   December has 31 days
   February has 28 days
   January has 31 days
   July has 31 days
   June has 30 days
   March	has 31 days
   May has 31 days
   November has 30 days
   October has 31 days
   September has	30 days

 WARNING

   Member function templates are	used in	all containers provided	by the
   Standard C++ Library.  An	example	of this	feature	is the constructor
   for map<Key,T,Compare,Allocator> that takes two templated iterators:

   template <class InputIterator>
   map (InputIterator, InputIterator, const Compare& = Compare(),
        const Allocator&	= Allocator());

   map also has an insert function of this type.	 These functions, when
   not restricted by compiler limitations, allow you to use any type
   of input iterator as arguments.  For compilers that do not support
   this  feature, we provide substitute functions that allow you to use
   an	iterator obtained from the same type of container as the one
   you are  constructing (or calling a member function on), or you can
   use a pointer  to the type of element you have in the container.

   For example, if your compiler	does not support member	function
   templates, you can construct a map in the following two ways:

   map<int, int,	less<int> >::value_type	intarray[10];
   map<int, int,	less<int> > first_map(intarray,	intarray + 10);
   map<int, int,	less<int> > second_map(first_map.begin(),
 				      first_map.end());

   But not this way:

   map<long, long, less<long> > long_map(first_map.begin(),
 				       first_map.end());

   Since	the long_map and first_map are not the same type.

   Also,	many compilers do not support default template arguments.   If
   your compiler is one of these, you	need to	always supply the
   Compare template argument and the Allocator template argument. For
   instance, you'll have to write:

   map<int, int,	less<int>,  allocator<int> >

   instead of:

   map<int, int>

 SEE ALSO

   allocator, Containers, Iterators, multimap

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  6 - multimap

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   multimap  - An associative container providing access	to non-key
   values using	keys.  multimap	keys are not required to be unique.
   A multimap supports	bidirectional iterators.

 SYNOPSIS

   #include <map>

   template <class Key, class T,	class Compare =	less<Key>,
 	   class Allocator = allocator<T> >
   class	multimap ;

 DESCRIPTION

   multimap <Key	,T, Compare, Allocator>	provides fast access to	stored
   values of type T which are indexed by keys of type Key.  The
   default operation for key comparison is the	< operator.  Unlike
   map, multimap  allows insertion of duplicate keys.

   multimap provides bidirectional iterators which point	to  an
   instance	of pair<const Key x, T y> where x is the key and y is
   the stored value  associated with that key. The  definition of
   multimap provides a typedef  to this pair called value_type.

   The types used for both the template parameters  Key	and T must
   provide the following	(where T is the	type, t	is a value of T	and u
   is a const value	of T):

   Copy constructors -  T(t) and	T(u)
    Destructor	     -	t.~T()
    Address of	     -	&t and &u yielding T* and
 			const T* respectively
    Assignment	     -	t = a where a is a
 			 (possibly const) value	of T

   The type used	for the	Compare	template parameter must	satisfy	the
   requirements	for binary functions.

 INTERFACE

   template <class Key, class T,	class Compare =	less<Key>,
 	   class Allocator = allocator<T> >
   class	multimap {

   public:

   // types

     typedef Key	key_type;
     typedef T mapped_type;
     typedef pair<const Key, T> value_type;
     typedef Compare key_compare;
     typedef Allocator allocator_type;
     typename reference;
     typename const_reference;
     typename iterator;
     typename const_iterator;
     typename size_type;
     typename difference_type;
     typename reverse_iterator;
     typename const_reverse_iterator;

   class	value_compare
       :	public binary_function<value_type, value_type, bool>
       {
       friend class multimap<Key, T, Compare, Allocator>;

       public :
 	bool operator()	(const value_type&, const value_type&) const;
       };

   // Construct/Copy/Destroy

     explicit multimap (const Compare& =	Compare(), const Allocator& =
 		       Allocator());
     template <class InputIterator>
      multimap (InputIterator, InputIterator,
 	       const Compare& =	Compare(),
 	       const Allocator&	= Allocator());
     multimap (const multimap<Key, T, Compare, Allocator>&);
      ~multimap ();
     multimap<Key, T, Compare, Allocator>& operator=
 	 (const	multimap<Key, T, Compare, Allocator>&);

   // 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;

   // Capacity

     bool empty () const;
     size_type size () const;
     size_type max_size () const;

   // Modifiers

     iterator insert (const value_type&);
     iterator insert (iterator, const value_type&);
     template <class InputIterator>
      void insert (InputIterator, InputIterator);

     iterator erase (iterator);
     size_type erase (const key_type&);
     iterator erase (iterator, iterator);
     void swap (multimap<Key, T,	Compare, Allocator>&);

   // Observers

     key_compare	key_comp () const;
     value_compare value_comp ()	const;

   // Multimap operations

     iterator find (const key_type&);
     const_iterator find	(const key_type&) const;
     size_type count (const key_type&) const;

     iterator lower_bound (const	key_type&);
     const_iterator lower_bound (const key_type&) const;
     iterator upper_bound (const	key_type&);
     const_iterator upper_bound (const key_type&) const;
     pair<iterator, iterator> equal_range (const	key_type&);
     pair<const_iterator, const_iterator>
       equal_range (const key_type&) const;
   };

   // Non-member	Operators

   template <class Key, class T,class Compare, class Allocator>
   bool operator== (const multimap<Key, T, Compare, Allocator>&,
 		   const multimap<Key, T, Compare, Allocator>&);

   template <class Key, class T,class Compare, class Allocator>
   bool operator!= (const multimap<Key, T, Compare, Allocator>&,
 		   const multimap<Key, T, Compare, Allocator>&);

   template <class Key, class T,	class Compare, class Allocator>
   bool operator< (const	multimap<Key, T, Compare, Allocator>&,
 		  const	multimap<Key, T, Compare, Allocator>&);

   template <class Key, class T,	class Compare, class Allocator>
   bool operator> (const	multimap<Key, T, Compare, Allocator>&,
 		  const	multimap<Key, T, Compare, Allocator>&);

   template <class Key, class T,	class Compare, class Allocator>
   bool operator<= (const multimap<Key, T, Compare, Allocator>&,
 		  const	multimap<Key, T, Compare, Allocator>&);

   template <class Key, class T,	class Compare, class Allocator>
   bool operator>= (const multimap<Key, T, Compare, Allocator>&,
 		  const	multimap<Key, T, Compare, Allocator>&);

   // Specialized Algorithms

   template <class Key, class T,	class Compare, class Allocator>
   void swap (multimap<Key, T, Compare, Allocator>&,
 	     multimap<Key, T, Compare, Allocator>&;

 CONSTRUCTORS AND DESTRUCTORS

   explicit multimap(const Compare& comp	= Compare(),
 		   const Allocator& alloc = Allocator());
      Default constructor.  Constructs an empty	multimap  that will
      use the optional relation comp to order  keys and the allocator
      alloc for all storage  management.

   template <class InputIterator>
   multimap(InputIterator first,
 	   InputIterator last,
 	   const Compare& comp = Compare()
 	   const Allocator& alloc = Allocator());
      Constructs a multimap containing values in  the  range
      [first,last).   Creation	of the new multimap is only
      guaranteed to succeed if the iterators first and  last  return
      values of	type pair<class Key, class T>.

   multimap(const multimap<Key, T, Compare, Allocator>& x);
      Copy constructor.	Creates	a new multimap by copying all pairs of
      key and value from x.

   ~multimap();
      The destructor.  Releases any allocated memory for	this multimap.

 ASSIGNMENT OPERATOR

   multimap<Key,	T, Compare, Allocator>&
   operator=(const multimap<Key,	T, Compare, Allocator>&	x);
      Replaces the contents of *this with a copy	of the multimap	x.

 ALLOCATOR

   allocator_type
   get_allocator() const;
      Returns a copy of the allocator used by self for storage
      management.

 ITERATORS

   iterator
   begin() ;
      Returns a bidirectional iterator pointing to the first element
      stored in	the multimap.  "First" is defined by the multimap's
      comparison operator, Compare.

   const_iterator
   begin() const;
      Returns a const_iterator pointing to the first element stored in
      the multimap. "First" is defined by the multimap's comparison
      operator,Compare.

   iterator
   end()	;
      Returns a bidirectional iterator pointing to the last element
      stored in the multimap, i.e. the off-the-end value.

   const_iterator
   end()	const;
      Returns a const_iterator pointing to the last element stored in
      the  multimap.

   reverse_iterator
   rbegin() ;
      Returns a reverse_iterator	pointing to the	first element stored
      in	the multimap. "First" is defined by the multimap's comparison
      operator, Compare.

   const_reverse_iterator
   rbegin() const;
      Returns a const_reverse_iterator pointing to the first element
      stored in the multimap.

   reverse_iterator
   rend() ;
      Returns a reverse_iterator	pointing to the	last element stored
      in the multimap, i.e., the off-the-end value.

   const_reverse_iterator
   rend() const;
      Returns a const_reverse_iterator pointing to the last element
      stored in the multimap.

 MEMBER FUNCTIONS

   void
   clear();
      Erases all	elements from the self.

   size_type
   count(const key_type&	x) const;
      Returns the number	of elements in the multimap with the key value
      x.

   bool
   empty() const;
      Returns true if the multimap is empty, false otherwise.

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

   pair<const_iterator,const_iterator>
   equal_range(const key_type& x) const;
      Returns the pair (lower_bound(x), upper_bound(x)).

   iterator
   erase(iterator first,	iterator last);
      Providing the iterators first and last point to the same multimap
      and last is reachable from first, all elements in the range
      (first, last) will be deleted from the multimap. Returns an
      iterator  pointing to	the element following the last
      deleted	element, or end(),  if there were no elements after
      the	deleted	range.

   iterator
   erase(iterator position);
      Deletes the multimap element pointed to by	the iterator position.
      Returns an	iterator pointing to the element following the deleted
      element, or end(), if	the deleted item was the last one in
      this list.

   size_type
   erase(const key_type&	x);
      Deletes the elements with the key value x from the	map, if	any
      exist. Returns the number	of deleted elements, or	 0 otherwise.

   iterator
   find(const key_type& x);
      Searches the multimap for a pair with the key value x and	returns
      an iterator to that pair if it is found.  If such a pair is not
      found the value end()  is returned.

   const_iterator
   find(const key_type& x) const;
      Same as find above	but returns a const_iterator.

   iterator
   insert(const value_type& x);
   iterator
   insert(iterator position, const value_type& x);
      x is inserted into	the multimap.  A position may be supplied as a
      hint regarding where to	do the insertion.  If the insertion
      may	be done	right after position  then it takes amortized
      constant  time.  Otherwise it will take O(log N)	time.

   template <class InputIterator>
   void
   insert(InputIterator first, InputIterator last);
      Copies of each element in the range [first, last) will be
      inserted	into the multimap.  The	iterators first	and last must
      return values of type pair<T1,T2>.  This	operation takes
      approximately O(N*log(size()+N)) time.

   key_compare
   key_comp() const;
      Returns a function	object capable of comparing key	values using
      the comparison operation,	Compare, of the	current	multimap.

   iterator
   lower_bound(const key_type& x);
      Returns an	iterator to the	 first	multimap element whose key  is
      greater  than or equal to x.  If no such element exists then end()
      is returned.

   const_iterator
   lower_bound(const key_type& x) const;
      Same as lower_bound above but returns a const_iterator.

   size_type
   max_size() const;
      Returns the maximum possible size of the multimap.

   size_type
   size() const;
      Returns the number	of elements in the multimap.

   void
   swap(multimap<Key, T,	Compare, Allocator>& x);
      Swaps the contents	of the multimap	x with the current multimap,
      *this.

   iterator
   upper_bound(const key_type& x);
      Returns an	iterator to the	first element  whose key is less than
      or equal to x.  If no	such element exists, then end()	is
      returned.

   const_iterator
   upper_bound(const key_type& x) const;
      Same as upper_bound above but returns a const_iterator.

   value_compare
   value_comp() const;
      Returns a function	object capable of comparing value_types
      (key,value pairs) using the comparison operation, Compare, of
      the current multimap.

 NON-MEMBER OPERATORS

   bool
   operator==(const multimap<Key, T, Compare, Allocator>& x,
 	    const multimap<Key,	T, Compare, Allocator>&	y);
      Returns true if all  elements in	x are element-wise equal  to
      all elements in y, using	(T::operator==). Otherwise  it returns
      false.

   bool
   operator!=(const multimap<Key, T, Compare, Allocator>& x,
 	    const multimap<Key,	T, Compare, Allocator>&	y);
 	       Returns !(x==y).

   bool
   operator<(const multimap<Key,	T, Compare, Allocator>&	x,
 	    const multimap<Key,	T, Compare, Allocator>&	y);
 	       Returns true if x is lexicographically less than	y.
                Otherwise, it	returns	false.

   bool
   operator>(const multimap<Key,	T, Compare, Allocator>&	x,
 	    const multimap<Key,	T, Compare, Allocator>&	y);
 	       Returns y < x.

   bool
   operator<=(const multimap<Key, T, Compare, Allocator>& x,
 	    const multimap<Key,	T, Compare, Allocator>&	y);
 	       Returns !(y < x).

   bool
   operator>=(const multimap<Key, T, Compare, Allocator>& x,
 	    const multimap<Key,	T, Compare, Allocator>&	y);
 	       Returns !(x < y).

 SPECIALIZED ALGORITHMS

   template<class Key, class T, class Compare, class Allocator>
   void swap(multimap<Key, T, Compare, Allocator>& a,
 	    multimap<Key, T, Compare, Allocator>& b);
 	       Efficiently swaps the contents of a and b.

 EXAMPLE

   //
   // multimap.cpp
   //
    #include <string>
    #include <map>
    #include <iostream.h>

   typedef multimap<int,	string,	less<int> > months_type;

    // Print out	a pair
   template <class First, class Second>
   ostream& operator<<(ostream& out,
 		      const pair<First,Second>&	p)
    {
     cout << p.second <<	" has "	<< p.first << "	days";
     return out;
    }

    // Print out	a multimap
   ostream& operator<<(ostream& out, months_type	l)
    {
     copy(l.begin(),l.end(), ostream_iterator
 	       <months_type::value_type,char>(cout,"0));
     return out;
    }

   int main(void)
    {
      //	create a multimap of months and	the number of
      //	days in	the month
     months_type	months;

     typedef months_type::value_type value_type;

      //	Put the	months in the multimap
     months.insert(value_type(31, string("January")));
     months.insert(value_type(28, string("February")));
     months.insert(value_type(31, string("March")));
     months.insert(value_type(30, string("April")));
     months.insert(value_type(31, string("May")));
     months.insert(value_type(30, string("June")));
     months.insert(value_type(31, string("July")));
     months.insert(value_type(31, string("August")));
     months.insert(value_type(30, string("September")));
     months.insert(value_type(31, string("October")));
     months.insert(value_type(30, string("November")));
     months.insert(value_type(31, string("December")));

      //	print out the months
     cout << "All months	of the year" <<	endl <<	months << endl;

      //	Find the Months	with 30	days
     pair<months_type::iterator,months_type::iterator> p	=
 	   months.equal_range(30);

      //	print out the 30 day months
     cout << endl << "Months with 30 days" << endl;
     copy(p.first,p.second,
       ostream_iterator<months_type::value_type,char>(cout,"0));

     return 0;
    }

   Output :
   All months of	the year
   February has 28 days
   April	has 30 days
   June has 30 days
   September has	30 days
   November has 30 days
   January has 31 days
   March	has 31 days
   May has 31 days
   July has 31 days
   August has 31	days
   October has 31 days
   December has 31 days

   Months with 30 days
   April	has 30 days
   June has 30 days
   September has	30 days
   November has 30 days

 WARNINGS

   Member function templates are	used in	all containers provided	by the
   Standard C++ Library.  An	example	of this	feature	is the constructor
   for multimap<Key,T,Compare,Allocator>  that takes	two templated
   iterators:

   template <class InputIterator>
   multimap (InputIterator, InputIterator,
 	    const Compare& = Compare(),
 	    const Allocator& = Allocator());

   multimap also	has an insert function of this type.  These functions,
   when not restricted by compiler limitations, allow	you to use any
   type of	input iterator as arguments. For compilers that do not
   support this	feature	we provide substitute functions that allow you
   to  use an	iterator obtained from the same	type of	container as
   the one you are constructing (or calling a member function on), or
   you	can use	a pointer to the type of element you have in the
   container.

   For example, if your compiler	does not support member	function
   templates you can construct a multimap in the following	two
   ways:

   multimap<int,int>::value_type	intarray[10];
   multimap<int,int> first_map(intarry, intarray	+ 10);
   multimap<int,int>
    second_multimap(first_multimap.begin(), first_multimap.end());

   but not this way:

   multimap<long,long>
    long_multimap(first_multimap.begin(),first_multimap.end());

   since	the long_multimap and first_multimap are not the same type.

   Also,	many compilers do not support default template arguments.  If
   your compiler is one of these you need to always supply the Compare
   template argument and the Allocator template argument.	For
   instance you'll have  to write:

   multimap<int,	int, less<int>,	allocator<int> >

   instead of:

   multimap<int,	int>

 SEE ALSO

   allocator, Containers, Iterators, map

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  7 - multiset

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   multiset  - An associative container providing fast access to
   stored key values.  Storage of duplicate	keys is	allowed.
   A multiset supports bidirectional	iterators.

 SYNOPSIS

   #include <set>

   template <class Key, class Compare = less<Key>,
 	   class Allocator = allocator<Key> >
   class	multiset;

 DESCRIPTION

   multiset <Key, Compare, Allocator> provides fast access to stored
   key values.  The default operation for key comparison is the <
   operator.  Insertion of duplicate keys is allowed with a multiset.

   multiset provides bidirectional iterators which point	to a stored
   key.

   Any type used	for the	template parameter  Key	must provide the
   following (where T is the type,	t is a value of	T and u	is a
   const value of T):

    Copy	constructors	T(t) and T(u)
    Destructor		t.~T()
    Address of		&t and &u yielding T* and
 			const T* respectively
    Assignment		t = a where a is a
 			 (possibly const) value	of T The type used
                          for the Compare template parameter must
                          satisfy the  requirements for binary
                          functions.

 INTERFACE

   template <class Key, class Compare = less<Key>,
 	   class Allocator = allocator<Key> >
   class	multiset {

   public:

   // typedefs

     typedef Key	key_type;
     typedef Key	value_type;
     typedef Compare key_compare;
     typedef Compare value_compare;
     typedef Allocator allocator_type;
     typename reference;
     typename const_reference;
     typename iterator;
     typename const_iterator;
     typename size_type;
     typename difference_type;
     typename reverse_iterator;
     typename const_reverse_iterator;

   // Construct/Copy/Destroy

     explicit multiset (const Compare& =	Compare(),
 		       const Allocator&	= Allocator());
     template <class InputIterator>
      multiset (InputIterator, InputIterator,
 	       const Compare& =	Compare(),
 	       const Allocator&	= Allocator());
     multiset (const multiset<Key, Compare, Allocator>&);
      ~multiset ();
     multiset<Key, Compare, Allocator>& operator= (const	multiset<Key,
 	      Compare,
 	      Allocator>&);

   // 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;

   // Capacity

     bool empty () const;
     size_type size () const;
     size_type max_size () const;

   // Modifiers

     iterator insert (const value_type&);
     iterator insert (iterator, const value_type&);
     template <class InputIterator>
      void insert (InputIterator, InputIterator);

     iterator erase (iterator);
     size_type erase (const key_type&);
     iterator erase (iterator, iterator);
     void swap (multiset<Key, Compare, Allocator>&);
     void clear ();

   // Observers

     key_compare	key_comp () const;
     value_compare value_comp ()	const;

   // Multiset operations

     iterator find (const key_type&) const;
     size_type count (const key_type&) const;
     iterator lower_bound (const	key_type&) const;
     iterator upper_bound (const	key_type&) const;
     pair<iterator, iterator> equal_range (const	key_type&) const;
      };

   // Non-member	Operators

   template <class Key, class Compare, class Allocator>
   bool operator==
       (const multiset<Key, Compare, Allocator>&,
       const multiset<Key, Compare, Allocator>&);

   template <class Key, class Compare, class Allocator>
   bool operator!=
       (const multiset<Key, Compare, Allocator>&,
       const multiset<Key, Compare, Allocator>&);

   template <class Key, class Compare, class Allocator>
   bool operator<
       (const multiset<Key, Compare, Allocator>&,
       const multiset<Key, Compare, Allocator>&);

   template <class Key, class Compare, class Allocator>
   bool operator>
       (const multiset<Key, Compare, Allocator>&,
       const multiset<Key, Compare, Allocator>&);

   template <class Key, class Compare, class Allocator>
   bool operator<=
       (const multiset<Key, Compare, Allocator>&,
       const multiset<Key, Compare, Allocator>&);

   template <class Key, class Compare, class Allocator>
   bool operator>=
       (const multiset<Key, Compare, Allocator>&,
       const multiset<Key, Compare, Allocator>&);

   // Specialized Algorithms

   template <class Key, class Compare, class Allocator>
   void swap ( multiset<Key, Compare, Allocator>&,
 	      multiset<Key, Compare, Allocator>&);

 CONSTRUCTOR AND	DESTRUCTOR

   explicit multiset(const Compare& comp	= Compare(),
 		    const Allocator& alloc = Allocator());
      Default	constructor.  Constructs an empty  multiset which
      will  use	the optional  relation comp to order keys, if	it is
      supplied,	and the	allocator alloc	for all storage management.

   template <class InputIterator>
   multiset(InputIterator first,	InputIterator last,
 	   const Compare& = Compare(),
 	   const Allocator& = Allocator());
      Constructs a multiset containing values in the range [first,
      last).

   multiset(const multiset<Key, Compare,	Allocator>& x);
      Copy constructor.	Creates	a new multiset	by copying all key
      values from x.

   ~multiset();
      The destructor.  Releases any allocated memory for	this multiset.

 ASSIGNMENT OPERATOR

   multiset<Key,	Compare, Allocator>&
   operator=(const multiset<Key,	Compare, Allocator>& x);
      Replaces the contents of *this with a copy	of the contents	of x.

 ALLOCATOR

   allocator_type
   get_allocator() const;
      Returns a copy of the allocator used by self for storage
      management.

 ITERATORS

   iterator
   begin();
      Returns an	iterator pointing to the first element stored in the
      multiset.  "First" is	defined	by the multiset's comparison
      operator,  Compare.

   const_iterator
   begin();
      Returns a const_iterator pointing to the first element stored in
      the multiset.

   iterator
   end();
      Returns an	iterator pointing to the last element stored in	the
      multiset, i.e., the off-the-end value.

   const_iterator
   end();
      Returns a const_iterator pointing to the last  element stored in
      the multiset, i.e., the off-the-end value.

   reverse_iterator
   rbegin();
      Returns a reverse_iterator	pointing to the	first element stored
      in	the multiset.	"First"	is defined by the multiset's
      comparison	operator, Compare.

   const_reverse_iterator
   rbegin();
      Returns a const_reverse_iterator pointing to the  first element
      stored in	the multiset.

   reverse_iterator
   rend();
      Returns a reverse_iterator	pointing to the	last element stored
      in the multiset, i.e., the off-the-end value.

   const_reverse_iterator
   rend();
      Returns a const_reverse_iterator pointing to the last element
      stored  in the multiset, i.e., the off-the-end value.

 MEMBER FUNCTIONS

   void
   clear();
      Erases all	elements from the self.

   size_type
   count(const key_type&	x) const;
      Returns the number	of elements in the multiset with the key value
      x.

   bool
   empty() const;
      Returns true if the multiset is empty, false otherwise.

   pair<iterator,iterator>
   equal_range(const key_type& x)const;
      Returns the pair (lower_bound(x), upper_bound(x)).

   size_type
   erase(const key_type&	x);
      Deletes all elements with the key value x from the	multiset, if
      any exist.  Returns the number	of deleted elements.

   iterator
   erase(iterator position);
      Deletes the multiset element pointed to by	the iterator position.
      Returns an	iterator pointing to the element following the deleted
      element, or end() if the deleted item	was the	last one in
      this  list.

   iterator
   erase(iterator first,	iterator last);
      Providing the iterators first and last point to the same multiset
      and last is reachable from first, all elements	in the range
      (first, last) will be deleted from the multiset.	Returns	an
      iterator pointing to	the element following the last
      deleted	element, or end() if there were	no elements after the
      deleted	range.

   iterator
   find(const key_type& x) const;
      Searches the multiset for a key value x and returns an iterator
      to	that key if it is found.  If such a value is not found the
      iterator end() is returned.

   iterator
   insert(const value_type& x);
   iterator
   insert(iterator position, const value_type& x);
      x is inserted into	the multiset.  A position may be supplied as a
      hint regarding where to	do the insertion.  If the insertion
      may	be done	right after position, then it takes amortized
      constant  time.  Otherwise,	it will take O(log N)	time.

   template <class InputIterator>
   void
   insert(InputIterator first, InputIterator last);
      Copies of each element in the range [first, last) will be
      inserted into the multiset.	 This insert takes
      approximately O(N*log(size()+N)) time.

   key_compare
   key_comp() const;
      Returns a function	object capable of comparing key	values using
      the comparison operation,	Compare, of the	current	multiset.

   iterator
   lower_bound(const key_type& x) const;
      Returns an	iterator to the	 first element whose key is greater
      than or equal to x.  If no	such element exists, end() is
      returned.

   size_type
   max_size() const;
      Returns the maximum possible size of the multiset size_type.

   size_type
   size() const;
      Returns the number	of elements in the multiset.

   void
   swap(multiset<Key, Compare, Allocator>& x);
      Swaps the contents	of the multiset	x with the current multiset,
      *this.

   iterator
   upper_bound(const key_type& x) const;
      Returns an	iterator to the	first  element whose key is smaller
      than or equal to x.  If no	such element exists then end() is
      returned.

   value_compare
   value_comp() const;
      Returns a function	object capable of comparing key	values using
      the comparison operation,	Compare, of the	current	 multiset.

 NON-MEMBER OPERATORS

   template <class Key, class Compare, class Allocator>
   operator==(const multiset<Key, Compare, Allocator>& x,
 	     const multiset<Key, Compare, Allocator>& y);
      Returns	true if	all  elements in x are element-wise  equal to
      all elements in	y, using (T::operator==).  Otherwise it
      returns	false.

   template <class Key, class Compare, class Allocator>
   operator!=(const multiset<Key, Compare, Allocator>& x,
 	     const multiset<Key, Compare, Allocator>& y);
 		Returns	!(x==y).

   template <class Key, class Compare, class Allocator>
   operator<(const multiset<Key,	Compare, Allocator>& x,
 	    const multiset<Key,	Compare, Allocator>& y);
 	       Returns true if x is lexicographically less than	y.
                Otherwise, it returns false.

   template <class Key, class Compare, class Allocator>
   operator>(const multiset<Key,	Compare, Allocator>& x,
 	    const multiset<Key,	Compare, Allocator>& y);
 	       Returns y < x.

   template <class Key, class Compare, class Allocator>
   operator<=(const multiset<Key, Compare, Allocator>& x,
 	    const multiset<Key,	Compare, Allocator>& y);
 	       Returns !(y < x).

   template <class Key, class Compare, class Allocator>
   operator>=(const multiset<Key, Compare, Allocator>& x,
 	    const multiset<Key,	Compare, Allocator>& y);
 	       Returns !(x < y).

 SPECIALIZED ALGORITHMS

   template <class Key, class Compare, class Allocator>
   void swap(multiset<Key,Compare,Allocator>& a,
 	    multiset<Key,Compare,Allocator>&b);
 	       Efficiently swaps the contents of a and b.

 EXAMPLE

   //
   // multiset.cpp
   //
   #include <set>
   #include <iostream.h>

   typedef multiset<int,	less<int>, allocator> set_type;

   ostream& operator<<(ostream& out, const set_type& s)
    {
     copy(s.begin(),s.end(),
 	 ostream_iterator<set_type::value_type,char>(cout," "));
     return out;
    }

   int main(void)
    {
      //	create a multiset of ints
     set_type  si;
     int	 i;

     for	(int j = 0; j <	2; j++)
      {
       for(i = 0; i < 10; ++i) {
 	 // insert values with a hint
 	si.insert(si.begin(), i);
        }
      }

      //	print out the multiset
     cout << si << endl;

      //	Make another int multiset and an empty multiset
     set_type si2, siResult;
     for	(i = 0;	i < 10;	i++)
        si2.insert(i+5);
     cout << si2	<< endl;

      //	Try a couple of	set algorithms
     set_union(si.begin(),si.end(),si2.begin(),si2.end(),
 	   inserter(siResult,siResult.begin()));
     cout << "Union:" <<	endl <<	siResult << endl;

     siResult.erase(siResult.begin(),siResult.end());
     set_intersection(si.begin(),si.end(),
 	   si2.begin(),si2.end(),
 	   inserter(siResult,siResult.begin()));
     cout << "Intersection:" << endl << siResult	<< endl;

     return 0;
    }

   Output:
   0 0 1	1 2 2 3	3 4 4 5	5 6 6 7	7 8 8 9	9
   5 6 7	8 9 10 11 12 13	14
   Union:
   0 0 1	1 2 2 3	3 4 4 5	5 6 6 7	7 8 8 9	9 10 11	12 13 14
   Intersection:
   5 6 7	8 9

 WARNINGS

   Member function templates are	used in	all containers	provided by
   the	Standard C++ Library.  An	example	of this	feature	is the
   constructor for multiset<Key,	Compare, Allocator>, which takes two
   templated iterators:

   template <class InputIterator>
   multiset (InputIterator, InputIterator,
 	   const Compare& = Compare(),
 	   const Allocator& = Allocator());

   multiset also	has an insert function of  this	type.  These
   functions,	when not restricted by compiler limitations, allow
   you to use any  type of input iterator as arguments. For compilers
   that do not support this	feature, we provide substitute
   functions that allow you to use  an	iterator obtained from the
   same	type of	container as the one you  are constructing (or calling
   a member function on).  You can also	use a pointer to the type of
   element you have in the container.

   For example, if your compiler	does not support member	 function
   templates, you can construct a multiset in the following	two
   ways:

   int intarray[10];
   multiset<int>	first_multiset(intarray,
 						    intarray +10);
   multiset<int>
     second_multiset(first_multiset.begin(), first_multiset.end());

   but not this way:

   multiset<long>
     long_multiset(first_multiset.begin(),first_multiset.end());

   since	the long_multiset and first_multiset are not the  same type.

   Also,	many compilers do not support default template arguments.  If
   your compiler is one of these you need to always supply the Compare
   template argument and the Allocator template argument.	For
   instance, you'll have to  write:

   multiset<int,	less<int>, allocator<int> >

   instead of:

   multiset<int>

 SEE ALSO

   allocator, Containers, Iterators, set

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  8 - priority_queue

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   priority_queue  - A container	adapter	which behaves like a priority
   queue. Items	are popped from	the queue are in order with respect
   to a "priority."

 SYNOPSIS

   #include <queue>

   template <class T,
 	   class Container = vector<T>,
 	   class Compare = less<Container::value_type> >
   class	priority_queue;

 DESCRIPTION

   priority_queue is a container	adaptor	which allows a container to
   act	  as a priority queue.  This	means that the item with the
   highest  priority, as determined by	either the default comparison
   operator  (operator <) or the comparison Compare, is brought to the
   front of  the queue whenever anything is pushed onto or popped off
   the queue.

   priority_queue adapts	any container that  provides  front(),
   push_back() and pop_back().  In particular, deque	 and vector
   can	be used.

 INTERFACE

   template <class T,
 	   class Container = vector<T>,
 	   class Compare = less<typename Container::value_type>	>
   class	priority_queue {
   public:

   // typedefs
     typedef typename Container::value_type value_type;
     typedef typename Container::size_type size_type;
     typedef typename allocator_type allocator_type;

   //  Construct
     explicit priority_queue (const Compare& = Compare(),
 			     const allocator_type&=allocator_type());
     template <class InputIterator>
       priority_queue (InputIterator first,
 		      InputIterator last,
 		      const Compare& = Compare(),
 		      const allocator_type& = allocator_type());
     allocator_type get_allocator() const;
     bool empty () const;
     size_type size () const;
     const value_type& top () const;
     void push (const value_type&);
     void pop();
   };

 CONSTRUCTORS

   explicit priority_queue (const Compare& x = Compare(),
 	       const allocator_type& alloc = allocator_type());
 		  Default constructor.	Constructs a priority queue
                   that uses Container for	its underlying
                   implementation, x as its	standard for
                   determining priority, and the allocator alloc for
                   all storage management.

   template <class InputIterator>
   priority_queue (InputIterator	first, InputIterator last,
 	      const Compare& x = Compare(),
 	      const allocator_type& alloc = allocator_type());
      Constructs a new priority queue and places into it  every entity
      in the range [first, last).  The  priority_queue	will use x for
      determining the priority,  and  the allocator alloc  for all
      storage management.

 ALLOCATOR

   allocator_type get_allocator () const;
      Returns a copy of the allocator used by self for storage
      management.

 MEMBER FUNCTIONS

   bool
   empty	() const;
      Returns true if the priority_queue	is empty, false	otherwise.

   void
   pop();
      Removes the item with the highest priority	from the queue.

   void
   push (const value_type& x);
      Adds x to the queue.

   size_type
   size () const;
      Returns the number	of elements in the priority_queue.

   const	value_type&
   top () const;
      Returns a constant	reference to the element in the	queue with the
      highest priority.

 EXAMPLE

   //
   // p_queue.cpp
   //
    #include <queue>
    #include <deque>
    #include <vector>
    #include <string>
    #include <iostream.h>

   int main(void)
    {
      //	Make a priority	queue of int using a vector container
      priority_queue<int, vector<int>, less<int>	> pq;

      //	Push a couple of values
     pq.push(1);
     pq.push(2);

      //	Pop a couple of	values and examine the ends
     cout << pq.top() <<	endl;
     pq.pop();
     cout << pq.top() <<	endl;
     pq.pop();

      //	Make a priority	queue of strings using a deque container
      priority_queue<string, deque<string>, less<string>	>
        pqs;

      //	Push on	a few strings then pop them back off
     int	i;
     for	(i = 0;	i < 10;	i++)
      {
       pqs.push(string(i+1,'a'));
       cout << pqs.top()	<< endl;
      }
     for	(i = 0;	i < 10;	i++)
      {
       cout << pqs.top()	<< endl;
       pqs.pop();
      }

      //	Make a priority	queue of strings using a deque
      //	container, and greater as the compare operation
     priority_queue<string,deque<string>, greater<string> > pgqs;

      //	Push on	a few strings then pop them back off
     for	(i = 0;	i < 10;	i++)
      {
       pgqs.push(string(i+1,'a'));
       cout << pgqs.top() << endl;
      }

     for	(i = 0;	i < 10;	i++)
      {
       cout << pgqs.top() << endl;
       pgqs.pop();
      }

     return 0;
    }

   Output :
   2
   1
   a
   aa
   aaa
   aaaa
   aaaaa
   aaaaaa
   aaaaaaa
   aaaaaaaa
   aaaaaaaaa
   aaaaaaaaaa
   aaaaaaaaa
   aaaaaaaa
   aaaaaaa
   aaaaaa
   aaaaa
   aaaa
   aaa
   aa
   a
   a
   a
   a
   a
   a
   a
   a
   a
   a
   a
   a
   aa
   aaa
   aaaa
   aaaaa
   aaaaaa
   aaaaaaa
   aaaaaaaa
   aaaaaaaaa
   aaaaaaaaaa

 WARNING

   If your compiler does	not support default template parameters, you
   must always provide a Container template parameter, and a Compare
   template parameter  when declaring an instance	of
   priority_queue.  For	example, you would	not be able to write,

   priority_queue<int> var;

   Instead, you would have to write,

   priority_queue<int, vector<int>,
    less<typename vector<int>::value_type> > var;

 SEE ALSO

   Containers, queue

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  9 - queue

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   queue	 - A container adaptor that behaves like a queue (first	in,
   first out).

   This page describes ANSI queue class.	If you would like information
   on the HP C++ task queue class, use	the command:

        help cxxl

 SYNOPSIS

   #include <queue>

   template <class T, class Container = deque<T>	> class	queue ;

 DESCRIPTION

   The queue container adaptor lets a container function	as a queue.
   In	a queue, items are pushed into the back	of the container and
   removed from the front.  The first items pushed into the queue are
   the	first items to be popped off of	the queue (first in,  first
   out,	or "FIFO").

   queue	can adapt any container	that supports the front(), back(),
   push_back() and pop_front() operations.  In particular, deque	and
   list can be used.

 INTERFACE

   template <class T, class Container = deque<T>	>
   class	queue {

   public:

   // typedefs

     typedef typename Container::value_type value_type;
     typedef typename Container::size_type size_type;
     typedef typename Container::allocator_type allocator_type;

   // Construct/Copy/Destroy
     explicit queue (const allocator_type& = allocator_type());
     allocator_type get_allocator () const;

   // Accessors

     bool empty () const;
     size_type size () const;
     value_type&	front ();
     const value_type& front () const;
     value_type&	back ();
     const value_type& back () const;
     void push (const value_type&);
     void pop ();
   };

   // Non-member	Operators

   template <class T, class Container>
   bool operator== (const queue<T, Container>&,
 		   const queue<T, Container>&);

   template <class T, class Container>
   bool operator!= (const queue<T, Container>&,
 		   const queue<T, Container>&);

   template <class T, class Container>
   bool operator< (const	queue<T, Container>&,
 		  const	queue<T, Container>&);

   template <class T, class Container>
   bool operator> (const	queue<T, Container>&,
 		  const	queue<T, Container>&);

   template <class T, class Container>
   bool operator<= (const queue<T, Container>&,
 		  const	queue<T, Container>&);

   template <class T, class Container>
   bool operator>= (const queue<T, Container>&,
 		  const	queue<T, Container>&);

 CONSTRUCTORS

   explicit queue (const	allocator_type&	alloc= allocator_type());
      Creates a queue of	zero elements.	The queue will use the
      allocator alloc for all storage management.

 ALLOCATOR

   allocator_type get_allocator () const;
      Returns a copy of the allocator used by self for storage
      management.

 MEMBER FUNCTIONS

   value_type&
   back ();
      Returns a reference to the	item at	the back of the	queue (the
      last	item pushed into the queue).

   const	value_type&
   back() const;
      Returns a constant	reference to the item at the back of the queue
      as a const_value_type.

   bool
   empty	() const;
      Returns true if the queue is empty, otherwise false.

   value_type&
   front	();
      Returns a reference to the	item at	the front of the queue.	  This
      will be the first item pushed onto	the queue unless pop()  has
      been	called since then.

   const	value_type&
   front	() const;
      Returns a constant	reference to  the item at the front of the
      queue as a const_value_type.

   void
   pop ();
      Removes the item at the front of the queue.

   void
   push (const value_type& x);
      Pushes x onto the back of the queue.

   size_type
   size () const;
      Returns the number	of elements on the queue.

 NON-MEMBER OPERATORS

   template <class T, class Container>
    bool	operator== (const queue<T, Container>& x,
 		    const queue<T, Container>& y);
      Equality operator.  Returns true if x	is the  same as y.

   template <class T, class Container>
    bool	operator!= (const queue<T, Container>& x,
 		    const queue<T, Container>& y);
      Inequality operator.	Returns	!(x==y).

   template <class T, class Container>
    bool	operator< (const queue<T, Container>& x,
 		   const queue<T, Container>& y);
      Returns true if the queue	defined	by the  elements
      contained in	x is	lexicographically  less than the
      queue defined by the elements  contained	in y.

   template <class T, class Container>
    bool	operator> (const queue<T, Container>& x,
 		   const queue<T, Container>& y);
 		      Returns y	< x.

   template <class T, class Container>
    bool	operator< (const queue<T, Container>& x,
 		   const queue<T, Container>& y);
 		      Returns !(y < x).

   template <class T, class Container>
    bool	operator< (const queue<T, Container>& x,
 		   const queue<T, Container>& y);
 		      Returns !(x < y).

 EXAMPLE

   //
   // queue.cpp
   //
    #include <queue>
    #include <string>
    #include <deque>
    #include <list>
    #include <iostream.h>

   int main(void)
    {
      //	Make a queue using a list container
      queue<int,	list<int>> q;

      //	Push a couple of values	on then	pop them off
     q.push(1);
     q.push(2);
     cout << q.front() << endl;
     q.pop();
     cout << q.front() << endl;
     q.pop();

      //	Make a queue of	strings	using a	deque container
      queue<string,deque<string>> qs;

      //	Push on	a few strings then pop them back off
     int	i;
     for	(i = 0;	i < 10;	i++)
      {
       qs.push(string(i+1,'a'));
       cout << qs.front() << endl;
      }
     for	(i = 0;	i < 10;	i++)
      {
       cout << qs.front() << endl;
       qs.pop();
      }

     return 0;
    }

   Output :
   1
   2
   a
   a
   a
   a
   a
   a
   a
   a
   a
   a
   a
   aa
   aaa
   aaaa
   aaaaa
   aaaaaa
   aaaaaaa
   aaaaaaaa
   aaaaaaaaa
   aaaaaaaaaa

 WARNINGS

   If your compiler does	not support default template  parameters, you
   must always provide a Container template	parameter.  For
   example you would not be able to write:

   queue<int> var;

   rather, you would have to write,

   queue<int, deque<int>	> var;

 SEE ALSO

   allocator, Containers, priority_queue

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  10 - set

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   set  - An associative	container that supports	unique keys.  A	set
          supports bidirectional	iterators.

 SYNOPSIS

   #include <set>

   template <class Key, class Compare = less<Key>,
    class Allocator = allocator<Key> >
   class	set ;

 DESCRIPTION

   set<Key, Compare, Allocator> is an associative container that
   supports unique keys and provides for fast retrieval of the keys.  A
   set contains at most one of any key value.  The keys are sorted
   using	Compare.

   Since	a set maintains	a total	order on its elements, you cannot
   alter	the key values directly.	Instead, you must insert new
   elements with an insert_iterator.

   Any type used	for the	template parameter Key must provide the
   following (where T is the type,	t is a value of	T and u	is a
   const value of T):

    Copy	constructors	 T(t) and T(u)
    Destructor		 t.~T()
    Address of		 &t and	&u yielding T* and
 			 const T* respectively
    Assignment		 t = a where a is a
 			 (possibly const) value	of T

   The type used	for the	Compare	template parameter must	satisfy	the
   requirements	for binary functions.

 INTERFACE

   template <class Key, class Compare = less<Key>,
 	   class Allocator = allocator<Key> >
   class	set {

   public:

    // types

     typedef Key	key_type;
     typedef Key	value_type;
     typedef Compare key_compare;
     typedef Compare value_compare;
     typedef Allocator allocator_type;
     typename reference;
     typename const_reference;
     typename iterator;
     typename const_iterator;
     typename size_type;
     typename difference_type;
     typename reverse_iterator;
     typename const_reverse_iterator;

    // Construct/Copy/Destroy

     explicit set (const	Compare& = Compare(),
 		  const	Allocator& = Allocator ());
     template <class InputIterator>
      set (InputIterator, InputIterator,	const Compare& = Compare(),
 	  const	Allocator& = Allocator ());
     set	(const set<Key,	Compare, Allocator>&);
      ~set ();
     set<Key, Compare, Allocator>& operator= (const set <Key, Compare,
     Allocator>&);
     allocator_type get_allocator () const;

    // 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;

    // Capacity

     bool empty () const;
     size_type size () const;
     size_type max_size () const;

    // Modifiers

     pair<iterator, bool> insert	(const value_type&);
     iterator insert (iterator, const value_type&);
     template <class InputIterator>
      void insert (InputIterator, InputIterator);
     iterator erase (iterator);
     size_type erase (const key_type&);
     iterator erase (iterator, iterator);
     void swap (set<Key,	Compare, Allocator>&);
     void clear ();

    // Observers

     key_compare	key_comp () const;
     value_compare value_comp ()	const;

    // Set operations

     size_type count (const key_type&) const;
     pair<iterator, iterator> equal_range (const	 key_type&) const;
     iterator find (const key_type&) const;
     iterator lower_bound (const	key_type&) const;
     iterator upper_bound (const	key_type&) const

   };

    // Non-member Operators

   template <class Key, class Compare, class Allocator>
   bool operator== (const set<Key, Compare, Allocator>&,
 		   const set<Key, Compare, Allocator>&);

   template <class Key, class Compare, class Allocator>
   bool operator!= (const set<Key, Compare, Allocator>&,
 		   const set<Key, Compare, Allocator>&);

   template <class Key, class Compare, class Allocator>
   bool operator< (const	set<Key, Compare, Allocator>&,
 		  const	set<Key, Compare, Allocator>&);

   template <class Key, class Compare, class Allocator>
   bool operator> (const	set<Key, Compare, Allocator>&,
 		  const	set<Key, Compare, Allocator>&);

   template <class Key, class Compare, class Allocator>
   bool operator<= (const set<Key, Compare, Allocator>&,
 		  const	set<Key, Compare, Allocator>&);

   template <class Key, class Compare, class Allocator>
   bool operator>= (const set<Key, Compare, Allocator>&,
 		  const	set<Key, Compare, Allocator>&);

   // Specialized Algorithms

   template <class Key, class Compare, class Allocator>
   void swap (set <Key, Compare,	Allocator>&,
 	    set	<Key, Compare, Allocator>&);

 CONSTRUCTORS AND DESTRUCTORS

   explicit
   set(const Compare& comp = Compare(),
       const Allocator& alloc = Allocator());
 	 The default constructor.  Creates a set of zero elements.  If the
 	 function object comp is supplied, it is used to compare elements
          of the set.   Otherwise, the default function object in the
          template argument is used.  The	template argument
          defaults to less (<).	The allocator alloc is used for all
          storage management.

   template <class InputIterator>
   set(InputIterator first, InputIterator last,
       const Compare& comp = Compare()
       const Allocator& alloc = Allocator());
      Creates a set of length last -	first, filled with all values
      obtained by dereferencing the InputIterators on the range [first,
      last).	 If the	function object	comp is	supplied, it is	used
      to	compare elements of the set.  Otherwise, the default function
      object in the template argument is used.	 The template
      argument defaults	to less (<). Uses	the allocator  alloc
      for	all storage management.

   set(const set<Key, Compare, Allocator>& x);
      Copy constructor. Creates a copy of x.

   ~set();
      The destructor.  Releases any allocated memory for	self.

 ASSIGNMENT OPERATOR

   set<Key, Compare, Allocator>&
   operator=(const set<Key, Compare, Allocator>&	x);
      Assignment	operator.  Self	will share an implementation with x.
      Returns a reference to self.

 ALLOCATOR

   allocator_type
   get_allocator() const;
      Returns a copy of the allocator used by self for storage
      management.

 ITERATORS

   iterator
   begin();
      Returns an	iterator that points to	the first element in self.

   const_iterator
   begin() const;
      Returns a const_iterator that points to the first element in
      self.

   iterator
   end();
      Returns an	iterator that points to	the past-the-end value.

   const_iterator
   end()	const;
      Returns a const_iterator that points to the past-the-end value.

   reverse_iterator
   rbegin();
      Returns a reverse_iterator	that points to the past-the-end	value.

   const_reverse_iterator
   rbegin() const;
      Returns a const_reverse_iterator that points to the past-the-end
      value.

   reverse_iterator
   rend();
      Returns a reverse_iterator	that points to the first element.

   const_reverse_iterator
   rend() const;
      Returns a const_reverse_iterator that points to the first
      element.

 MEMBER FUNCTIONS

   void
   clear();
      Erases all	elements from the set.

   size_type
   count(const key_type&	x) const;
      Returns the number	of elements equal to x.	 Since a set supports
      unique keys, count will always return 1 or 0.

   bool
   empty() const;
      Returns true if the size is zero.

   pair<iterator, iterator>
   equal_range(const key_type&  x) const;
      Returns pair(lower_bound(x),upper_bound(x)).  The equal_range
      function indicates the valid range for insertion of x into the
      set.

   size_type
   erase(const key_type&	x);
      Deletes all the elements matching x.   Returns the	number of
      elements erased.  Since a set supports unique keys,	erase
      will always return  1 or 0.

   iterator
   erase(iterator position);
      Deletes the map element pointed to	by the iterator	position.
      Returns an iterator pointing to the element following	the
      deleted element, or end() if the deleted item was the last  one
      in this list.

   iterator
   erase(iterator first,	iterator last);
      Deletes the elements in the range (first, last). Returns an
      iterator pointing to the element following the last deleted
      element, or end() if there were	no elements after the deleted
      range.

   iterator
   find(const key_value&	x) const;
      Returns an	iterator that points to	the element equal to x.	 If
      there is no	such element, the iterator points to the
      past-the-end value.

   pair<iterator, bool>
   insert(const value_type& x);
      Inserts x into self according to the comparison function object.
      The template's	default	comparison function object is less
      (<).	If the insertion succeeds, it returns a pair composed
      of the iterator  position	where the insertion took	place,
      and true.   Otherwise, the pair contains the end value,	and
      false.

   iterator
   insert(iterator position, const value_type& x);
      x is inserted into	the set. A position may	be supplied as a hint
      regarding where to do the insertion. If the insertion may be done
      right after position then it takes amortized constant time.
      Otherwise it will take 0 (log N) time. The return value points
      to the inserted x.

   template <class InputIterator>
   void
   insert(InputIterator first, InputIterator last);
      Inserts copies of the elements in the range [first, last].

   key_compare
   key_comp() const;
      Returns the comparison function object for	the set.

   iterator
   lower_bound(const key_type& x) const;
      Returns an	iterator that points to	the first element that is
      greater than or equal to x.  If there is no such element, the
      iterator points  to the past-the-end value.

   size_type
   max_size() const;
      Returns size of the largest possible set.

   size_type
   size() const;
      Returns the number	of elements.

   void
   swap(set<Key,	Compare, Allocator>& x);
      Exchanges self with x.

   iterator
   upper_bound(const key_type& x) const
      Returns an	iterator that points to	the first element that is
      greater than or equal to x.  If there is no such element, the
      iterator points  to the past-the-end value.

   value_compare
   value_comp() const;
      Returns the set's comparison object. This is identical to the
      function key_comp().

 NON-MEMBER OPERATORS

   template <class Key, class Compare, class Allocator>
   bool operator==(const	set<Key, Compare, Allocator>& x,
 		   const set<Key, Compare, Allocator>& y);
      Equality operator. Returns true if x is the same as y.

   template <class Key, class Compare, class Allocator>
   bool operator!=(const	set<Key, Compare, Allocator>& x,
 		   const set<Key, Compare, Allocator>& y);
      Inequality operator. Returns !(x==y).

   template <class Key, class Compare, class Allocator>
   bool operator<(const set <Key, Compare, Allocator>& x,
 		 const set <Key, Compare, Allocator>& y);
      Returns true if the	elements contained in x	are lexico-
      graphically	less than the elements contained in y.

   template <class Key, class Compare, class Allocator>
   bool operator>(const set <Key, Compare, Allocator>& x,
 		 const set <Key, Compare, Allocator>& y);
 		    Returns y <	x.

   template <class Key, class Compare, class Allocator>
   bool operator<=(const	set <Key, Compare, Allocator>& x,
 		 const set <Key, Compare, Allocator>& y);
 		    Returns !(y	< x).

   template <class Key, class Compare, class Allocator>
   bool operator>=(const	set <Key, Compare, Allocator>& x,
 		 const set <Key, Compare, Allocator>& y);
 		    Returns !(x	< y).

 SPECIALIZED ALGORITHMS

   template <class Key, class Compare, class Allocator>
   void swap(set	<Key, Compare, Allocator>& a,
 	    set	<Key, Compare, Allocator>& b);
 	       Efficiently swaps the contents of a and b.

 EXAMPLE

   //
   // set.cpp
   //
    #include <set>
    #include <iostream.h>

   typedef set<double, less<double>, allocator<double> >	set_type;

   ostream& operator<<(ostream& out, const set_type& s)
    {
     copy(s.begin(), s.end(),
 	 ostream_iterator<set_type::value_type,char>(cout," "));
     return out;
    }

   int main(void)
    {
      //	create a set of	doubles
     set_type   sd;
     int		i;

     for(i = 0; i < 10; ++i) {
        // insert values
       sd.insert(i);
      }

      //	print out the set
     cout << sd << endl << endl;

      //	now let's erase	half of	the elements in	the set
     int	half = sd.size() >> 1;
     set_type::iterator sdi = sd.begin();
     advance(sdi,half);

     sd.erase(sd.begin(),sdi);

      //	print it out again
     cout << sd << endl << endl;

      //	Make another set and an	empty result set
     set_type sd2, sdResult;
     for	(i = 1;	i < 9; i++)
        sd2.insert(i+5);
     cout << sd2	<< endl;

      //	Try a couple of	set algorithms
     set_union(sd.begin(),sd.end(),sd2.begin(),sd2.end(),
 	      inserter(sdResult,sdResult.begin()));
     cout << "Union:" <<	endl <<	sdResult << endl;

     sdResult.erase(sdResult.begin(),sdResult.end());
     set_intersection(sd.begin(),sd.end(),
 		     sd2.begin(),sd2.end(),
 		     inserter(sdResult,sdResult.begin()));
     cout << "Intersection:" << endl << sdResult	<< endl;

     return 0;
    }

   Output :

   0 1 2	3 4 5 6	7 8 9
   5 6 7	8 9
   6 7 8	9 10 11	12 13
   Union:
   5 6 7	8 9 10 11 12 13
   Intersection:
   6 7 8	9

 WARNINGS

   Member function templates are	used in	all containers provided	by the
   Standard C++ Library.  An	example	of this	feature	is the
   constructor for set <Key,	Compare, Allocator> that takes two
   templated iterators:

   template <class InputIterator>
   set (InputIterator, InputIterator,
        const Compare& =	Compare(),
        const Allocator&	= Allocator());

   set also has an insert function of this type.	 These functions, when
   not restricted by	compiler limitations, allow you	to use any
   type	of input iterator as arguments.   For compilers that do not
   support this feature, we provide substitute functions that allow you
   to use an	iterator obtained from the same	type of	container as
   the one you are constructing (or calling a member function on), or
   you	can use	a pointer to the type of element you have in the
   container.

   For example, if your compiler	does not support member	function
   templates you can construct a set in the following two ways:

   int intarray[10];
   set<int> first_set(intarray, intarray	+ 10);
   set<int> second_set(first_set.begin(),
 					   first_set.end());

   but not this way:

   set<long> long_set(first_set.begin(),
 					   first_set.end());

   since	the long_set and first_set are not the same type.

   Also,	many compilers do not support default template arguments.  If
   your compiler is one of these you need to always supply the Compare
   template argument, and	the Allocator template argument. For
   instance, you need	to write	:

   set<int, less<int>, allocator<int> >

   instead of :

   set<int>

 SEE ALSO

      allocator, bidirectional_iterator, Cont ainer,
      lexicographical_compare

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  11 - Sequences

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   Sequences  - A sequence is a container that organizes	a set of
   objects, all the same type, into a	linear arrangement. vector,
   list, deque,  and string fall into this category.

   Sequences offer different complexity trade-offs.  vector offers fast
   inserts and deletes from the end of the container.  deque is useful
   when insertions and deletions will	take place at the beginning or
   end of the sequence.  Use list when there are frequent insertions
   and deletions from the middle of	the sequence.

 SEE ALSO

   For more information about sequences and their requirements, see
   the Containers section of this reference guide, or see the section
   on the specific container.

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  12 - stack

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   stack	 - A container adapter which behaves like a stack (last	in,
   first out).

 SYNOPSIS

   #include <stack>

   template <class T, class Container = deque<T>	>
   class	stack ;

 DESCRIPTION

   The stack container adapter causes a container to behave like	a
   "last	in, first	out" (LIFO)  stack.  The last item that	was
   put	("pushed") onto	the stack	is the first item removed
   ("popped" off).  The stack can adapt to any container that provides
   the operations, back(),  push_back(),	and pop_back().  In
   particular,  deque , list , and vector	can be used.

 INTERFACE

   template <class T, class Container = deque<T>	>
   class	stack {

   public:

   // typedefs

     typedef typename Container::value_type value_type;
     typedef typename Container::size_type size_type;
     typedef typename Container::allocator_type allocator_type

   // Construct

     explicit stack (const allocator_type& = allocator_type());
     allocator_type get_allocator () const;

   // Accessors

     bool empty () const;
     size_type size () const;
     value_type&	top ();
     const value_type& top () const;
     void push (const value_type&);
     void pop ();
   };

   // Non-member	Operators

   template <class T, class Container>
   bool operator== (const stack<T, Container>&,
 		   const stack<T, Container>&);

   template <class T, class Container>
   bool operator!= (const stack<T, Container>&,
 		   const stack<T, Container>&);

   template <class T, class Container>
   bool operator< (const	stack<T, Container>&,
 		  const	stack<T, Container>&);

   template <class T, class Container>
   bool operator> (const	stack<T, Container>&,
 		  const	stack<T, Container>&);

   template <class T, class Container>
   bool operator<= (const stack<T, Container>&,
 		  const	stack<T, Container>&);

   template <class T, class Container>
   bool operator>= (const stack<T, Container>&,
 		  const	stack<T, Container>&);

 CONSTRUCTOR

   explicit
   stack(const allocator_type& alloc = allocator_taype());
      Constructs	an empty stack.	The stack will use the allocator alloc
      for all storage management.

 ALLOCATOR

   allocator_type
   get_allocator() const;
        Returns a copy of the allocator used by self for	storage
        management.

 MEMBER FUNCTIONS

   bool
   empty() const;
      Returns true if the stack is empty, otherwise false.

   void
   pop();
      Removes the item at the top of the	stack.

   void
   push(const value_type& x);
      Pushes x onto the stack.

   size_type
   size() const;
      Returns the number	of elements on the stack.

   value_type&
   top();
      Returns a reference to the	item at	the top	of the stack.  This
      will be  the last item pushed onto the stack unless	pop()
      has been called since then.

   const	value_type&
   top()	const;
      Returns a constant	reference to the item at the top of the	stack
      as a const value_type.

 NON-MEMBER OPERATORS

   template <class T, class Container>
    bool	operator==(const stack<T, Container>& x,
 		    const stack<T, Container>& y);
      Equality	operator.  Returns true	if x is	the same as y.

   template <class T, class Container>
    bool	operator!=(const stack<T, Container>& x,
 		    const stack<T, Container>& y);
      Inequality operator.  Returns !(x==y).

   template <class T, class Container>
    bool	operator<(const	stack<T, Container>& x,
 		   const stack<T, Container>& y);
      Returns true if the stack	defined	by the elements	contained in
      x is lexicographically less than  the stack defined by the
      elements of y.

   template <class T, class Container>
    bool	operator>(const	stack<T, Container>& x,
 		   const stack<T, Container>& y);
 		      Returns y	< x.

   template <class T, class Container>
    bool	operator<=(const stack<T, Container>& x,
 		   const stack<T, Container>& y);
 		      Returns !(y < x).

   template <class T, class Container>
    bool	operator>=(const stack<T, Container>& x,
 		   const stack<T, Container>& y);
 		      Returns !(x < y).

 EXAMPLE

   //
   // stack.cpp
   //
    #include <stack>
    #include <vector>
    #include <deque>
    #include <string>
    #include <iostream.h>

   int main(void)
    {
      //	Make a stack using a vector container
      stack<int,vector<int> > s;

      //	Push a couple of values	on the stack
     s.push(1);
     s.push(2);
     cout << s.top() << endl;

      //	Now pop	them off
     s.pop();
     cout << s.top() << endl;
     s.pop();

      //	Make a stack of	strings	using a	deque
      stack<string,deque<string>	> ss;

      //	Push a bunch of	strings	on then	pop them off
     int	i;
     for	(i = 0;	i < 10;	i++)
      {
       ss.push(string(i+1,'a'));
       cout << ss.top() << endl;
      }
     for	(i = 0;	i < 10;	i++)
      {
       cout << ss.top() << endl;
       ss.pop();
      }

     return 0;
    }
   Output :
   2
   1
   a
   aa
   aaa
   aaaa
   aaaaa
   aaaaaa
   aaaaaaa
   aaaaaaaa
   aaaaaaaaa
   aaaaaaaaaa
   aaaaaaaaaa
   aaaaaaaaa
   aaaaaaaa
   aaaaaaa
   aaaaaa
   aaaaa
   aaaa
   aaa
   aa
   a

 WARNINGS

   If your compiler does	not support template parameter defaults,  you
   are required to supply a template	parameter for Container.   For
   example:

   You would not	be able	to write,

   stack<int> var;

   Instead, you would have to write,

   stack<int, deque<int>	> var;

 SEE ALSO

   allocator, Containers, deque,	list, vector

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee

  13 - vector

 			   Standard C++	Library
 		 Copyright 1996, Rogue Wave Software, Inc.

 NAME

   vector  - Sequence that supports random access iterators.

   This page describes the ANSI vector class.  If you would like
   information on the pre-ANSI vector class,	use the	command:

        help cxxl

 SYNOPSIS

   #include <vector>

   template <class T, class Allocator = allocator<T> >
   class	vector ;

 DESCRIPTION

   vector<T, Allocator> is a type of sequence that supports random
   access iterators.  In addition, it supports amortized constant time
   insert and erase	operations at the end.	Insert and erase in
   the	middle take linear time.	 Storage management is handled
   automatically.  In vector, iterator is a random access iterator
   referring to	T.  const_iterator is a	constant random access
   iterator  that returns a const T& when being dereferenced.	A
   constructor for  iterator and const_iterator is guaranteed.
   size_type	is an unsigned integral type.  difference_type is a
   signed integral	type.

   Any type used	for the	template parameter T must provide  the
   following (where T is the type,	t is a value of	T and u	is a
   const value of T):

   Default constructor	T()
    Copy	constructors	 T(t) and T(u)
    Destructor		 t.~T()
    Address of		 &t and	&u yielding T* and
 			  const	T* respectively
    Assignment		 t = a where a is a
 			  (possibly const) value of T

 SPECIAL	CASE

   Vectors of bit values	(boolean 1/0 values) are handled as a special
   case by the standard library,	so that	they can be efficiently	packed
   several elements	to a word.  The	operations for a boolean
   vector,  vector<bool>, are a superset of those for	an ordinary
   vector, only  the implementation is more efficient.

   Two member functions are available to	the boolean vector data	type.
   One is flip(), which inverts all the bits	of the vector.
   Boolean	vectors	also return as reference an internal value
   that also  supports the flip() member function.  The other
   vector<bool>-specific  member function is	a second form of the
   swap()	function

 INTERFACE

   template <class T, class Allocator = allocator<T> >
   class	vector {

   public:

    // Types

     typedef T value_type;
     typedef Allocator allocator_type;
     typename reference;
     typename const_reference;
     typename iterator;
     typename const_iterator;
     typename size_type;
     typename difference_type;
     typename reverse_iterator;
     typename const_reverse_iterator;

    // Construct/Copy/Destroy

     explicit vector (const Allocator& =	Allocator());
     explicit vector (size_type,	const Allocator& = Allocator ());
     vector (size_type, const T&, const Allocator& = Allocator());
     vector (const vector<T, Allocator>&);
     template <class InputIterator>
      vector (InputIterator, InputIterator,
 	     const Allocator& =	Allocator ());
      ~vector ();
     vector<T,Allocator>& operator= (const vector<T, Allocator>&);
     template <class InputIterator>
      void assign (InputIterator	first, InputIterator last);
     template <class Size, class	TT>
      void assign (Size n);
     template <class Size, class	TT>
      void assign (Size n, const	TT&);
     allocator_type get_allocator () const;

    // 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;

    // Capacity

     size_type size () const;
     size_type max_size () const;
     void resize	(size_type);
     void resize	(size_type, T);
     size_type capacity () const;
     bool empty () const;
     void reserve (size_type);

    // Element Access

     reference operator[] (size_type);
     const_reference operator[] (size_type) const;
     reference at (size_type);
     const_reference at (size_type) const;
     reference front ();
     const_reference front () const;
     reference back ();
     const_reference back () const;

    // Modifiers

     void push_back (const T&);
     void pop_back ();
     iterator insert (iterator);
     iterator insert (iterator, const T&);
     void insert	(iterator, size_type, const T&);
     template <class InputIterator>
      void insert (iterator, InputIterator, InputIterator);
     iterator erase (iterator);
     iterator erase (iterator, iterator);
     void swap (vector<T, Allocator>&);

   };

    // Non-member Operators

   template <class T>
   bool operator== (const vector<T,Allocator>&,
 		   const vector	<T,Allocator>&);

   template <class T>
   bool operator!= (const vector<T,Allocator>&,
 		   const vector	<T,Allocator>&);

   template <class T>
   bool operator< (const	vector<T,Allocator>&,
 		  const	vector<T,Allocator>&);

   template <class T>
   bool operator> (const	vector<T,Allocator>&,
 		  const	vector<T,Allocator>&);

   template <class T>
   bool operator<= (const vector<T,Allocator>&,
 		  const	vector<T,Allocator>&);

   template <class T>
   bool operator>= (const vector<T,Allocator>&,
 		  const	vector<T,Allocator>&);

   // Specialized Algorithms

   template <class T, class Allocator>
   void swap (const vector<T,Allocator>&, const vector<T,Allocator>&);

 CONSTRUCTORS AND DESTRUCTORS

   explicit vector(const	Allocator& alloc = Allocator());
      The default constructor.  Creates a vector	of length zero.	The
      vector will use the allocator alloc for all storage management.

   explicit vector(size_type n,
 		  const	Allocator& alloc = Allocator());
      Creates a vector of length	n, containing n	copies  of the default
      value for type T. Requires	that T  have a default constructor.
      The vector will use  the allocator alloc for all storage
      management.

   vector(size_type n, const T& value,
 	 const Allocator& alloc	= Allocator());
      Creates a vector of	length n, containing n copies of
      value.	  The vector will	use the	allocator alloc	for
      all	storage	management.

   vector(const vector<T, Allocator>& x);
      Creates a copy of x.

   template <class InputIterator>
   vector(InputIterator first, InputIterator last,
 	 const Allocator& alloc	= Allocator());
      Creates a vector of	length last - first, filled with all
      values obtained by	dereferencing the InputIterators on the	range
      [first, last). The vector will use the allocator alloc  for all
      storage management.

   ~vector();
      The destructor.  Releases any allocated memory for	this vector.

 ITERATORS

   iterator
   begin();
      Returns a random access iterator that points to the first
      element.

   const_iterator
   begin() const;
      Returns a random access const_iterator that points	to the first
      element.

   iterator
   end();
      Returns a random access iterator that points to the past-the-end
      value.

   const_iterator
   end()	const;
      Returns a random access const_iterator that points	to the
      past-the-end value.

   reverse_iterator
   rbegin();
      Returns a random access reverse_iterator that points to the
      past-the-end value.

   const_reverse_iterator
   rbegin() const;
      Returns a random access const_reverse_iterator that points	to the
      past-the-end value.

   reverse_iterator
   rend();
      Returns a random access reverse_iterator that points to the first
      element.

   const_reverse_iterator
   rend() const;
      Returns a random access const_reverse_iterator that points	to the
      first element.

 ASSIGNMENT OPERATOR

   vector<T, Allocator>&
   operator=(const vector<T, Allocator>&	x);
      Erases all	elements in self then inserts into self	a copy of each
      element in x.	 Returns a reference to	self.

 ALLOCATOR

   allocator_type
   get_allocator() const;
      Returns a copy of the allocator used by self for storage
      management.

 REFERENCE OPERATORS

   reference
   operator[](size_type n);
      a reference to element n of self.	The result can be used
      as  an lvalue.  The index	n must be between 0 and	the size less
      one.

   const_reference
   operator[](size_type n) const;
      Returns a constant	reference to element n of self.	The index n
      must  be between 0 and the size less one.

 MEMBER FUNCTIONS

   template <class InputIterator>
   void
   assign(InputIterator first, InputIterator last);
      Erases all	elements contained in self, then inserts new elements
      from the range [first, last).

   template <class Size,	class T>
   void
   assign(Size n, const T& t);
      Erases all	elements contained in self, then inserts n instances
      of	the default value of  type T.

   template <class Size,	class T>
   void
   assign(Size n, const T& t);
      Erases all	elements contained in self, then inserts n instances
      of	the value of t.

   reference
   at(size_type n);
      Returns a reference to element n of self.	 The result can	be
      used	as  an lvalue.  The index	n must be between 0
      and	the size less one.

   const_reference
   at(size_type)	const;
      Returns a constant	reference to element n of self.	The index n
      must  be between 0 and the size less one.

   reference
   back();
      Returns a reference to the	last element.

   const_reference
   back() const;
      Returns a constant	reference to the last element.

   size_type
   capacity() const;
      Returns the size of the allocated storage,	as the number of
      elements that can be stored.

   void
   clear() ;
      Deletes all elements from the vector.

   bool
   empty() const;
      Returns true if the size is zero.

   iterator
   erase(iterator position);
      Deletes the vector	element	pointed	to by the iterator position.
      Returns an	iterator pointing to the element following the deleted
      element,	or end() if the deleted element was the last one in
      this  vector.

   iterator
   erase(iterator first,	iterator last);
      Deletes the vector	elements in the	range (first, last).  Returns
      an iterator pointing to the element following	the last
      deleted element,  or end() if there were no elements in	the
      deleted range.

   void
   flip();
      Flips all the bits	in the vector.	This member function is	only
      defined for vector<bool>.

   reference
   front();
      Returns a reference to the	first element.

   const_reference
   front() const;
      Returns a constant	reference to the first element.

   iterator
   insert(iterator position);
      Inserts x before position.	 The return value  points to the
      inserted x.

   iterator
   insert(iterator position, const T& x);
      Inserts x before position.	 The return value  points to the
      inserted x.

   void
   insert(iterator position, size_type n, const	T& x);
      Inserts n copies of x before position.

   template <class InputIterator>
   void
   insert(iterator position, InputIterator first,
 	 InputIterator last);
 	    Inserts copies of the elements in the range	[first,	last]
             before position.

   size_type
   max_size() const;
      Returns size() of the largest possible vector.

   void
   pop_back();
      Removes the last element of self.

   void
   push_back(const T& x);
      Inserts a copy of x to the	end of self.

   void
   reserve(size_type n);
      Increases the capacity of self in anticipation of adding new
      elements. reserve itself does not add any new elements.  After a
      call to reserve, capacity()	is greater than	or equal to n
      and subsequent insertions	will not cause a reallocation until
      the	size of	the vector exceeds n.  Real location does not
      occur if	n is less than capacity().  If reallocation does
      occur, then all  iterators and	references pointing to
      elements	in the vector	are invalidated.  reserve takes	at
      most	linear time in the size of self.

   void
   resize(size_type sz);
      Alters the	size of	self.  If the new size (sz) is greater than
      the current size, then	sz-size() instances of the default
      value  of type T are inserted at the end of	the vector.
      If	the new	size is	smaller	than the current capacity, then	the
      vector is  truncated	by erasing size()-sz elements off the
      end. If sz is equal  to capacity then no action is taken.

   void
   resize(size_type sz, T c);
      Alters the	size of	self.  If the new size (sz) is greater than
      the current size, then	sz-size() c's are inserted at the end
      of the  vector. If	the new	size is	smaller	than the current
      capacity, then	the vector is truncated by erasing size()-sz
      elements off the end.  If sz	is equal to capacity then no
      action is	taken.

   size_type
   size() const;
      Returns the number	of elements.

   void
   swap(vector<T, Allocator>& x);
      Exchanges self with x, by swapping	all elements.

   void
   swap(reference x, reference y);
      Swaps the values of x and y.  This	is a member function of
      vector<bool> only.

 NON-MEMBER OPERATORS

   template <class T, class Allocator>
   bool operator==(const	vector<T, Allocator>& x,
 		  const	vector<T, Allocator>& y);
 		     Returns true if x is the same as y.

   template <class T, class Allocator>
   bool operator!=(const	vector<T, Allocator>& x,
 		  const	vector<T, Allocator>& y);
 		     Returns !(x==y).

   template <class T>
   bool operator<(const vector<T, Allocator>& x,
 		 const vector<T, Allocator>& y);
 		    Returns true if the	elements contained in x	are lexico-
 		    graphically	less than the elements contained in y.

   template <class T>
   bool operator>(const vector<T, Allocator>& x,
 		 const vector<T, Allocator>& y);
 		    Returns y <	x.

   template <class T>
   bool operator<=(const	vector<T, Allocator>& x,
 		 const vector<T, Allocator>& y);
 		    Returns !(y	< x).

   template <class T>
   bool operator>=(const	vector<T, Allocator>& x,
 		 const vector<T, Allocator>& y);
 		    Returns !(x	< y).

 SPECIALIZED ALGORITHMS

   template <class T, class Allocator>
   void swap(vector <T, Allocator>& a, vector <T, Allocator>& b);
      Efficiently swaps the contents of a and b.

 EXAMPLE

   //
   // vector.cpp
   //
    #include <vector>
    #include <iostream.h>
   ostream& operator<< (ostream&	out,
 		       const vector<int, allocator>& v)
    {
     copy(v.begin(), v.end(), ostream_iterator<int,char>(out," "));
     return out;
    }
   int main(void)
    {
      //	create a vector	of doubles
      vector<int>	 vi;
     int			i;
     for(i = 0; i < 10; ++i) {
        // insert values	before the beginning
       vi.insert(vi.begin(), i);
      }
      //	print out the vector
     cout << vi << endl;
      //	now let's erase	half of	the elements
     int	half = vi.size() >> 1;
     for(i = 0; i < half; ++i) {
       vi.erase(vi.begin());
      }
      //	print ir out again
     cout << vi << endl;
     return 0;
    }
   Output :

   9 8 7	6 5 4 3	2 1 0
   4 3 2	1 0

 WARNINGS

   Member function templates are	used in	all containers provided	by the
   Standard C++ Library.  An	example	of this	feature	is the
   constructor  for vector<T, Allocator> that takes two templated
   iterators:

   template <class InputIterator>
   vector (InputIterator, InputIterator,
 	  const	Allocator = Allocator());

   vector also has an insert function of	this type.  These functions,
   when  not restricted by	compiler limitations, allow you	to use
   any type	of input iterator as arguments.   For compilers that
   do not support  this feature we provide substitute functions that
   allow you to use an	iterator obtained from the same	type of
   container as the one you  are constructing (or calling a member
   function on), or you	can use	a  pointer to the type of element you
   have in the container.

   For example, if your compiler	does not support member	function
   templates you can construct a vector in	the following two
   ways:

   int intarray[10];
   vector<int> first_vector(intarray, intarray +	10);
   vector<int> second_vector(first_vector.begin(),
 				      first_vector.end());

   but not this way:

   vector<long>
   long_vector(first_vector.begin(),first_vector.end());

   since	the long_vector	and first_vector are not the same type.

   Additionally,	if your	compiler does not support default template
   parameters,	you will need to supply	the Allocator template
   argument.  For instance, you	will need to write :

   vector<int, allocator<int> >

   instead of :

   vector<int>

 SEE ALSO

   allocator, Containers, Iterators, lexicographical_compare

 STANDARDS CONFORMANCE
   ANSI X3J16/ISO WG21 Joint C++	Committee
  Close     Help