stl_multiset.h
上传用户:sichengcw
上传日期:2009-02-17
资源大小:202k
文件大小:7k
源码类别:

STL

开发平台:

Visual C++

  1. /*
  2.  *
  3.  * Copyright (c) 1994
  4.  * Hewlett-Packard Company
  5.  *
  6.  * Permission to use, copy, modify, distribute and sell this software
  7.  * and its documentation for any purpose is hereby granted without fee,
  8.  * provided that the above copyright notice appear in all copies and
  9.  * that both that copyright notice and this permission notice appear
  10.  * in supporting documentation.  Hewlett-Packard Company makes no
  11.  * representations about the suitability of this software for any
  12.  * purpose.  It is provided "as is" without express or implied warranty.
  13.  *
  14.  *
  15.  * Copyright (c) 1996
  16.  * Silicon Graphics Computer Systems, Inc.
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Silicon Graphics makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  25.  */
  26. /* NOTE: This is an internal header file, included by other STL headers.
  27.  *   You should not attempt to use it directly.
  28.  */
  29. #ifndef __SGI_STL_INTERNAL_MULTISET_H
  30. #define __SGI_STL_INTERNAL_MULTISET_H
  31. __STL_BEGIN_NAMESPACE
  32. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  33. #pragma set woff 1174
  34. #endif
  35. #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
  36. template <class Key, class Compare = less<Key>, class Alloc = alloc>
  37. #else
  38. template <class Key, class Compare, class Alloc = alloc>
  39. #endif
  40. class multiset {
  41. public:
  42.   // typedefs:
  43.   typedef Key key_type;
  44.   typedef Key value_type;
  45.   typedef Compare key_compare;
  46.   typedef Compare value_compare;
  47. private:
  48.   typedef rb_tree<key_type, value_type, 
  49.                   identity<value_type>, key_compare, Alloc> rep_type;
  50.   rep_type t;  // red-black tree representing multiset
  51. public:
  52.   typedef typename rep_type::const_pointer pointer;
  53.   typedef typename rep_type::const_pointer const_pointer;
  54.   typedef typename rep_type::const_reference reference;
  55.   typedef typename rep_type::const_reference const_reference;
  56.   typedef typename rep_type::const_iterator iterator;
  57.   typedef typename rep_type::const_iterator const_iterator;
  58.   typedef typename rep_type::const_reverse_iterator reverse_iterator;
  59.   typedef typename rep_type::const_reverse_iterator const_reverse_iterator;
  60.   typedef typename rep_type::size_type size_type;
  61.   typedef typename rep_type::difference_type difference_type;
  62.   // allocation/deallocation
  63.   multiset() : t(Compare()) {}
  64.   explicit multiset(const Compare& comp) : t(comp) {}
  65. #ifdef __STL_MEMBER_TEMPLATES
  66.   template <class InputIterator>
  67.   multiset(InputIterator first, InputIterator last)
  68.     : t(Compare()) { t.insert_equal(first, last); }
  69.   template <class InputIterator>
  70.   multiset(InputIterator first, InputIterator last, const Compare& comp)
  71.     : t(comp) { t.insert_equal(first, last); }
  72. #else
  73.   multiset(const value_type* first, const value_type* last)
  74.     : t(Compare()) { t.insert_equal(first, last); }
  75.   multiset(const value_type* first, const value_type* last,
  76.            const Compare& comp)
  77.     : t(comp) { t.insert_equal(first, last); }
  78.   multiset(const_iterator first, const_iterator last)
  79.     : t(Compare()) { t.insert_equal(first, last); }
  80.   multiset(const_iterator first, const_iterator last, const Compare& comp)
  81.     : t(comp) { t.insert_equal(first, last); }
  82. #endif /* __STL_MEMBER_TEMPLATES */
  83.   multiset(const multiset<Key, Compare, Alloc>& x) : t(x.t) {}
  84.   multiset<Key, Compare, Alloc>&
  85.   operator=(const multiset<Key, Compare, Alloc>& x) {
  86.     t = x.t; 
  87.     return *this;
  88.   }
  89.   // accessors:
  90.   key_compare key_comp() const { return t.key_comp(); }
  91.   value_compare value_comp() const { return t.key_comp(); }
  92.   iterator begin() const { return t.begin(); }
  93.   iterator end() const { return t.end(); }
  94.   reverse_iterator rbegin() const { return t.rbegin(); } 
  95.   reverse_iterator rend() const { return t.rend(); }
  96.   bool empty() const { return t.empty(); }
  97.   size_type size() const { return t.size(); }
  98.   size_type max_size() const { return t.max_size(); }
  99.   void swap(multiset<Key, Compare, Alloc>& x) { t.swap(x.t); }
  100.   // insert/erase
  101.   iterator insert(const value_type& x) { 
  102.     return t.insert_equal(x);
  103.   }
  104.   iterator insert(iterator position, const value_type& x) {
  105.     typedef typename rep_type::iterator rep_iterator;
  106.     return t.insert_equal((rep_iterator&)position, x);
  107.   }
  108. #ifdef __STL_MEMBER_TEMPLATES  
  109.   template <class InputIterator>
  110.   void insert(InputIterator first, InputIterator last) {
  111.     t.insert_equal(first, last);
  112.   }
  113. #else
  114.   void insert(const value_type* first, const value_type* last) {
  115.     t.insert_equal(first, last);
  116.   }
  117.   void insert(const_iterator first, const_iterator last) {
  118.     t.insert_equal(first, last);
  119.   }
  120. #endif /* __STL_MEMBER_TEMPLATES */
  121.   void erase(iterator position) { 
  122.     typedef typename rep_type::iterator rep_iterator;
  123.     t.erase((rep_iterator&)position); 
  124.   }
  125.   size_type erase(const key_type& x) { 
  126.     return t.erase(x); 
  127.   }
  128.   void erase(iterator first, iterator last) { 
  129.     typedef typename rep_type::iterator rep_iterator;
  130.     t.erase((rep_iterator&)first, (rep_iterator&)last); 
  131.   }
  132.   void clear() { t.clear(); }
  133.   // multiset operations:
  134.   iterator find(const key_type& x) const { return t.find(x); }
  135.   size_type count(const key_type& x) const { return t.count(x); }
  136.   iterator lower_bound(const key_type& x) const {
  137.     return t.lower_bound(x);
  138.   }
  139.   iterator upper_bound(const key_type& x) const {
  140.     return t.upper_bound(x); 
  141.   }
  142.   pair<iterator,iterator> equal_range(const key_type& x) const {
  143.     return t.equal_range(x);
  144.   }
  145.   friend bool operator== __STL_NULL_TMPL_ARGS (const multiset&,
  146.                                                const multiset&);
  147.   friend bool operator< __STL_NULL_TMPL_ARGS (const multiset&,
  148.                                               const multiset&);
  149. };
  150. template <class Key, class Compare, class Alloc>
  151. inline bool operator==(const multiset<Key, Compare, Alloc>& x, 
  152.                        const multiset<Key, Compare, Alloc>& y) {
  153.   return x.t == y.t;
  154. }
  155. template <class Key, class Compare, class Alloc>
  156. inline bool operator<(const multiset<Key, Compare, Alloc>& x, 
  157.                       const multiset<Key, Compare, Alloc>& y) {
  158.   return x.t < y.t;
  159. }
  160. #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
  161. template <class Key, class Compare, class Alloc>
  162. inline void swap(multiset<Key, Compare, Alloc>& x, 
  163.                  multiset<Key, Compare, Alloc>& y) {
  164.   x.swap(y);
  165. }
  166. #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
  167. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  168. #pragma reset woff 1174
  169. #endif
  170. __STL_END_NAMESPACE
  171. #endif /* __SGI_STL_INTERNAL_MULTISET_H */
  172. // Local Variables:
  173. // mode:C++
  174. // End: