stl_queu.h
上传用户:nizebo
上传日期:2022-05-14
资源大小:882k
文件大小: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_QUEUE_H
  30. #define __SGI_STL_INTERNAL_QUEUE_H
  31. #include <sequence_concepts.h>
  32. __STL_BEGIN_NAMESPACE
  33. // Forward declarations of operators < and ==, needed for friend declaration.
  34. template <class _Tp, 
  35.           class _Sequence __STL_DEPENDENT_DEFAULT_TMPL(deque<_Tp>) >
  36. class queue;
  37. template <class _Tp, class _Seq>
  38. inline bool operator==(const queue<_Tp, _Seq>&, const queue<_Tp, _Seq>&);
  39. template <class _Tp, class _Seq>
  40. inline bool operator<(const queue<_Tp, _Seq>&, const queue<_Tp, _Seq>&);
  41. template <class _Tp, class _Sequence>
  42. class queue {
  43.   // requirements:
  44.   __STL_CLASS_REQUIRES(_Tp, _Assignable);
  45.   __STL_CLASS_REQUIRES(_Sequence, _FrontInsertionSequence);
  46.   __STL_CLASS_REQUIRES(_Sequence, _BackInsertionSequence);
  47.   typedef typename _Sequence::value_type _Sequence_value_type;
  48.   __STL_CLASS_REQUIRES_SAME_TYPE(_Tp, _Sequence_value_type);
  49. #ifdef __STL_MEMBER_TEMPLATES 
  50.   template <class _Tp1, class _Seq1>
  51.   friend bool operator== (const queue<_Tp1, _Seq1>&,
  52.                           const queue<_Tp1, _Seq1>&);
  53.   template <class _Tp1, class _Seq1>
  54.   friend bool operator< (const queue<_Tp1, _Seq1>&,
  55.                          const queue<_Tp1, _Seq1>&);
  56. #else /* __STL_MEMBER_TEMPLATES */
  57.   friend bool __STD_QUALIFIER
  58.   operator== __STL_NULL_TMPL_ARGS (const queue&, const queue&);
  59.   friend bool __STD_QUALIFIER
  60.   operator<  __STL_NULL_TMPL_ARGS (const queue&, const queue&);
  61. #endif /* __STL_MEMBER_TEMPLATES */
  62. public:
  63.   typedef typename _Sequence::value_type      value_type;
  64.   typedef typename _Sequence::size_type       size_type;
  65.   typedef          _Sequence                  container_type;
  66.   typedef typename _Sequence::reference       reference;
  67.   typedef typename _Sequence::const_reference const_reference;
  68. protected:
  69.   _Sequence c;
  70. public:
  71.   queue() : c() {}
  72.   explicit queue(const _Sequence& __c) : c(__c) {}
  73.   bool empty() const { return c.empty(); }
  74.   size_type size() const { return c.size(); }
  75.   reference front() { return c.front(); }
  76.   const_reference front() const { return c.front(); }
  77.   reference back() { return c.back(); }
  78.   const_reference back() const { return c.back(); }
  79.   void push(const value_type& __x) { c.push_back(__x); }
  80.   void pop() { c.pop_front(); }
  81. };
  82. template <class _Tp, class _Sequence>
  83. bool 
  84. operator==(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y)
  85. {
  86.   return __x.c == __y.c;
  87. }
  88. template <class _Tp, class _Sequence>
  89. bool
  90. operator<(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y)
  91. {
  92.   return __x.c < __y.c;
  93. }
  94. #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
  95. template <class _Tp, class _Sequence>
  96. bool
  97. operator!=(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y)
  98. {
  99.   return !(__x == __y);
  100. }
  101. template <class _Tp, class _Sequence>
  102. bool 
  103. operator>(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y)
  104. {
  105.   return __y < __x;
  106. }
  107. template <class _Tp, class _Sequence>
  108. bool 
  109. operator<=(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y)
  110. {
  111.   return !(__y < __x);
  112. }
  113. template <class _Tp, class _Sequence>
  114. bool 
  115. operator>=(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y)
  116. {
  117.   return !(__x < __y);
  118. }
  119. #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
  120. template <class _Tp, 
  121.           class _Sequence __STL_DEPENDENT_DEFAULT_TMPL(vector<_Tp>),
  122.           class _Compare
  123.           __STL_DEPENDENT_DEFAULT_TMPL(less<typename _Sequence::value_type>) >
  124. class priority_queue {
  125.   // requirements:
  126.   __STL_CLASS_REQUIRES(_Tp, _Assignable);
  127.   __STL_CLASS_REQUIRES(_Sequence, _Sequence);
  128.   __STL_CLASS_REQUIRES(_Sequence, _RandomAccessContainer);
  129.   typedef typename _Sequence::value_type _Sequence_value_type;
  130.   __STL_CLASS_REQUIRES_SAME_TYPE(_Tp, _Sequence_value_type);
  131.   __STL_CLASS_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  132. public:
  133.   typedef typename _Sequence::value_type      value_type;
  134.   typedef typename _Sequence::size_type       size_type;
  135.   typedef          _Sequence                  container_type;
  136.   typedef typename _Sequence::reference       reference;
  137.   typedef typename _Sequence::const_reference const_reference;
  138. protected:
  139.   _Sequence c;
  140.   _Compare comp;
  141. public:
  142.   priority_queue() : c() {}
  143.   explicit priority_queue(const _Compare& __x) :  c(), comp(__x) {}
  144.   priority_queue(const _Compare& __x, const _Sequence& __s) 
  145.     : c(__s), comp(__x) 
  146.     { make_heap(c.begin(), c.end(), comp); }
  147. #ifdef __STL_MEMBER_TEMPLATES
  148.   template <class _InputIterator>
  149.   priority_queue(_InputIterator __first, _InputIterator __last) 
  150.     : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }
  151.   template <class _InputIterator>
  152.   priority_queue(_InputIterator __first, 
  153.                  _InputIterator __last, const _Compare& __x)
  154.     : c(__first, __last), comp(__x) 
  155.     { make_heap(c.begin(), c.end(), comp); }
  156.   template <class _InputIterator>
  157.   priority_queue(_InputIterator __first, _InputIterator __last,
  158.                  const _Compare& __x, const _Sequence& __s)
  159.   : c(__s), comp(__x)
  160.   { 
  161.     c.insert(c.end(), __first, __last);
  162.     make_heap(c.begin(), c.end(), comp);
  163.   }
  164. #else /* __STL_MEMBER_TEMPLATES */
  165.   priority_queue(const value_type* __first, const value_type* __last) 
  166.     : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }
  167.   priority_queue(const value_type* __first, const value_type* __last, 
  168.                  const _Compare& __x) 
  169.     : c(__first, __last), comp(__x)
  170.     { make_heap(c.begin(), c.end(), comp); }
  171.   priority_queue(const value_type* __first, const value_type* __last, 
  172.                  const _Compare& __x, const _Sequence& __c)
  173.     : c(__c), comp(__x) 
  174.   { 
  175.     c.insert(c.end(), __first, __last);
  176.     make_heap(c.begin(), c.end(), comp);
  177.   }
  178. #endif /* __STL_MEMBER_TEMPLATES */
  179.   bool empty() const { return c.empty(); }
  180.   size_type size() const { return c.size(); }
  181.   const_reference top() const { return c.front(); }
  182.   void push(const value_type& __x) {
  183.     __STL_TRY {
  184.       c.push_back(__x); 
  185.       push_heap(c.begin(), c.end(), comp);
  186.     }
  187.     __STL_UNWIND(c.clear());
  188.   }
  189.   void pop() {
  190.     __STL_TRY {
  191.       pop_heap(c.begin(), c.end(), comp);
  192.       c.pop_back();
  193.     }
  194.     __STL_UNWIND(c.clear());
  195.   }
  196. };
  197. // no equality is provided
  198. __STL_END_NAMESPACE
  199. #endif /* __SGI_STL_INTERNAL_QUEUE_H */
  200. // Local Variables:
  201. // mode:C++
  202. // End: