stl_map.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,1997
  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_MAP_H
  30. #define __SGI_STL_INTERNAL_MAP_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 T, class Compare = less<Key>, class Alloc = alloc>
  37. #else
  38. template <class Key, class T, class Compare, class Alloc = alloc>
  39. #endif
  40. class map {
  41. public:
  42. // typedefs:
  43.   typedef Key key_type;
  44.   typedef T data_type;
  45.   typedef T mapped_type;
  46.   typedef pair<const Key, T> value_type;
  47.   typedef Compare key_compare;
  48.     
  49.   class value_compare
  50.     : public binary_function<value_type, value_type, bool> {
  51.   friend class map<Key, T, Compare, Alloc>;
  52.   protected :
  53.     Compare comp;
  54.     value_compare(Compare c) : comp(c) {}
  55.   public:
  56.     bool operator()(const value_type& x, const value_type& y) const {
  57.       return comp(x.first, y.first);
  58.     }
  59.   };
  60. private:
  61.   typedef rb_tree<key_type, value_type, 
  62.                   select1st<value_type>, key_compare, Alloc> rep_type;
  63.   rep_type t;  // red-black tree representing map
  64. public:
  65.   typedef typename rep_type::pointer pointer;
  66.   typedef typename rep_type::const_pointer const_pointer;
  67.   typedef typename rep_type::reference reference;
  68.   typedef typename rep_type::const_reference const_reference;
  69.   typedef typename rep_type::iterator iterator;
  70.   typedef typename rep_type::const_iterator const_iterator;
  71.   typedef typename rep_type::reverse_iterator reverse_iterator;
  72.   typedef typename rep_type::const_reverse_iterator const_reverse_iterator;
  73.   typedef typename rep_type::size_type size_type;
  74.   typedef typename rep_type::difference_type difference_type;
  75.   // allocation/deallocation
  76.   map() : t(Compare()) {}
  77.   explicit map(const Compare& comp) : t(comp) {}
  78. #ifdef __STL_MEMBER_TEMPLATES
  79.   template <class InputIterator>
  80.   map(InputIterator first, InputIterator last)
  81.     : t(Compare()) { t.insert_unique(first, last); }
  82.   template <class InputIterator>
  83.   map(InputIterator first, InputIterator last, const Compare& comp)
  84.     : t(comp) { t.insert_unique(first, last); }
  85. #else
  86.   map(const value_type* first, const value_type* last)
  87.     : t(Compare()) { t.insert_unique(first, last); }
  88.   map(const value_type* first, const value_type* last, const Compare& comp)
  89.     : t(comp) { t.insert_unique(first, last); }
  90.   map(const_iterator first, const_iterator last)
  91.     : t(Compare()) { t.insert_unique(first, last); }
  92.   map(const_iterator first, const_iterator last, const Compare& comp)
  93.     : t(comp) { t.insert_unique(first, last); }
  94. #endif /* __STL_MEMBER_TEMPLATES */
  95.   map(const map<Key, T, Compare, Alloc>& x) : t(x.t) {}
  96.   map<Key, T, Compare, Alloc>& operator=(const map<Key, T, Compare, Alloc>& x)
  97.   {
  98.     t = x.t;
  99.     return *this; 
  100.   }
  101.   // accessors:
  102.   key_compare key_comp() const { return t.key_comp(); }
  103.   value_compare value_comp() const { return value_compare(t.key_comp()); }
  104.   iterator begin() { return t.begin(); }
  105.   const_iterator begin() const { return t.begin(); }
  106.   iterator end() { return t.end(); }
  107.   const_iterator end() const { return t.end(); }
  108.   reverse_iterator rbegin() { return t.rbegin(); }
  109.   const_reverse_iterator rbegin() const { return t.rbegin(); }
  110.   reverse_iterator rend() { return t.rend(); }
  111.   const_reverse_iterator rend() const { return t.rend(); }
  112.   bool empty() const { return t.empty(); }
  113.   size_type size() const { return t.size(); }
  114.   size_type max_size() const { return t.max_size(); }
  115.   T& operator[](const key_type& k) {
  116.     return (*((insert(value_type(k, T()))).first)).second;
  117.   }
  118.   void swap(map<Key, T, Compare, Alloc>& x) { t.swap(x.t); }
  119.   // insert/erase
  120.   pair<iterator,bool> insert(const value_type& x) { return t.insert_unique(x); }
  121.   iterator insert(iterator position, const value_type& x) {
  122.     return t.insert_unique(position, x);
  123.   }
  124. #ifdef __STL_MEMBER_TEMPLATES
  125.   template <class InputIterator>
  126.   void insert(InputIterator first, InputIterator last) {
  127.     t.insert_unique(first, last);
  128.   }
  129. #else
  130.   void insert(const value_type* first, const value_type* last) {
  131.     t.insert_unique(first, last);
  132.   }
  133.   void insert(const_iterator first, const_iterator last) {
  134.     t.insert_unique(first, last);
  135.   }
  136. #endif /* __STL_MEMBER_TEMPLATES */
  137.   void erase(iterator position) { t.erase(position); }
  138.   size_type erase(const key_type& x) { return t.erase(x); }
  139.   void erase(iterator first, iterator last) { t.erase(first, last); }
  140.   void clear() { t.clear(); }
  141.   // map operations:
  142.   iterator find(const key_type& x) { return t.find(x); }
  143.   const_iterator find(const key_type& x) const { return t.find(x); }
  144.   size_type count(const key_type& x) const { return t.count(x); }
  145.   iterator lower_bound(const key_type& x) {return t.lower_bound(x); }
  146.   const_iterator lower_bound(const key_type& x) const {
  147.     return t.lower_bound(x); 
  148.   }
  149.   iterator upper_bound(const key_type& x) {return t.upper_bound(x); }
  150.   const_iterator upper_bound(const key_type& x) const {
  151.     return t.upper_bound(x); 
  152.   }
  153.   
  154.   pair<iterator,iterator> equal_range(const key_type& x) {
  155.     return t.equal_range(x);
  156.   }
  157.   pair<const_iterator,const_iterator> equal_range(const key_type& x) const {
  158.     return t.equal_range(x);
  159.   }
  160.   friend bool operator== __STL_NULL_TMPL_ARGS (const map&, const map&);
  161.   friend bool operator< __STL_NULL_TMPL_ARGS (const map&, const map&);
  162. };
  163. template <class Key, class T, class Compare, class Alloc>
  164. inline bool operator==(const map<Key, T, Compare, Alloc>& x, 
  165.                        const map<Key, T, Compare, Alloc>& y) {
  166.   return x.t == y.t;
  167. }
  168. template <class Key, class T, class Compare, class Alloc>
  169. inline bool operator<(const map<Key, T, Compare, Alloc>& x, 
  170.                       const map<Key, T, Compare, Alloc>& y) {
  171.   return x.t < y.t;
  172. }
  173. #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
  174. template <class Key, class T, class Compare, class Alloc>
  175. inline void swap(map<Key, T, Compare, Alloc>& x, 
  176.                  map<Key, T, Compare, Alloc>& y) {
  177.   x.swap(y);
  178. }
  179. #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
  180. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  181. #pragma reset woff 1174
  182. #endif
  183. __STL_END_NAMESPACE
  184. #endif /* __SGI_STL_INTERNAL_MAP_H */
  185. // Local Variables:
  186. // mode:C++
  187. // End: