⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hashtable.h

📁 mpeg4 video codec mpeg4 video codec
💻 H
📖 第 1 页 / 共 3 页
字号:
      ++_M_num_elements;      return pair<iterator, bool>(iterator(__tmp, this), true);    }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::iterator    hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    insert_equal_noresize(const value_type& __obj)    {      const size_type __n = _M_bkt_num(__obj);      _Node* __first = _M_buckets[__n];            for (_Node* __cur = __first; __cur; __cur = __cur->_M_next)	if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj)))	  {	    _Node* __tmp = _M_new_node(__obj);	    __tmp->_M_next = __cur->_M_next;	    __cur->_M_next = __tmp;	    ++_M_num_elements;	    return iterator(__tmp, this);	  }      _Node* __tmp = _M_new_node(__obj);      __tmp->_M_next = __first;      _M_buckets[__n] = __tmp;      ++_M_num_elements;      return iterator(__tmp, this);    }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::reference    hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    find_or_insert(const value_type& __obj)    {      resize(_M_num_elements + 1);      size_type __n = _M_bkt_num(__obj);      _Node* __first = _M_buckets[__n];            for (_Node* __cur = __first; __cur; __cur = __cur->_M_next)	if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj)))	  return __cur->_M_val;            _Node* __tmp = _M_new_node(__obj);      __tmp->_M_next = __first;      _M_buckets[__n] = __tmp;      ++_M_num_elements;      return __tmp->_M_val;    }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    pair<typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::iterator,	 typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::iterator>    hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    equal_range(const key_type& __key)    {      typedef pair<iterator, iterator> _Pii;      const size_type __n = _M_bkt_num_key(__key);      for (_Node* __first = _M_buckets[__n]; __first;	   __first = __first->_M_next)	if (_M_equals(_M_get_key(__first->_M_val), __key))	  {	    for (_Node* __cur = __first->_M_next; __cur;		 __cur = __cur->_M_next)	      if (!_M_equals(_M_get_key(__cur->_M_val), __key))		return _Pii(iterator(__first, this), iterator(__cur, this));	    for (size_type __m = __n + 1; __m < _M_buckets.size(); ++__m)	      if (_M_buckets[__m])		return _Pii(iterator(__first, this),			    iterator(_M_buckets[__m], this));	    return _Pii(iterator(__first, this), end());	  }      return _Pii(end(), end());    }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    pair<typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::const_iterator,	 typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::const_iterator>    hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    equal_range(const key_type& __key) const    {      typedef pair<const_iterator, const_iterator> _Pii;      const size_type __n = _M_bkt_num_key(__key);      for (const _Node* __first = _M_buckets[__n]; __first;	   __first = __first->_M_next)	{	  if (_M_equals(_M_get_key(__first->_M_val), __key))	    {	      for (const _Node* __cur = __first->_M_next; __cur;		   __cur = __cur->_M_next)		if (!_M_equals(_M_get_key(__cur->_M_val), __key))		  return _Pii(const_iterator(__first, this),			      const_iterator(__cur, this));	      for (size_type __m = __n + 1; __m < _M_buckets.size(); ++__m)		if (_M_buckets[__m])		  return _Pii(const_iterator(__first, this),			      const_iterator(_M_buckets[__m], this));	      return _Pii(const_iterator(__first, this), end());	    }	}      return _Pii(end(), end());    }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::size_type    hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    erase(const key_type& __key)    {      const size_type __n = _M_bkt_num_key(__key);      _Node* __first = _M_buckets[__n];      size_type __erased = 0;            if (__first)	{	  _Node* __cur = __first;	  _Node* __next = __cur->_M_next;	  while (__next)	    {	      if (_M_equals(_M_get_key(__next->_M_val), __key))		{		  __cur->_M_next = __next->_M_next;		  _M_delete_node(__next);		  __next = __cur->_M_next;		  ++__erased;		  --_M_num_elements;		}	      else		{		  __cur = __next;		  __next = __cur->_M_next;		}	    }	  if (_M_equals(_M_get_key(__first->_M_val), __key))	    {	      _M_buckets[__n] = __first->_M_next;	      _M_delete_node(__first);	      ++__erased;	      --_M_num_elements;	    }	}      return __erased;    }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    void hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    erase(const iterator& __it)    {      _Node* __p = __it._M_cur;      if (__p)	{	  const size_type __n = _M_bkt_num(__p->_M_val);	  _Node* __cur = _M_buckets[__n];	  	  if (__cur == __p)	    {	      _M_buckets[__n] = __cur->_M_next;	      _M_delete_node(__cur);	      --_M_num_elements;	    }	  else	    {	      _Node* __next = __cur->_M_next;	      while (__next)		{		  if (__next == __p)		    {		      __cur->_M_next = __next->_M_next;		      _M_delete_node(__next);		      --_M_num_elements;		      break;		    }		  else		    {		      __cur = __next;		      __next = __cur->_M_next;		    }		}	    }	}    }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    void    hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    erase(iterator __first, iterator __last)    {      size_type __f_bucket = __first._M_cur ? _M_bkt_num(__first._M_cur->_M_val)	                                    : _M_buckets.size();      size_type __l_bucket = __last._M_cur ? _M_bkt_num(__last._M_cur->_M_val)	                                   : _M_buckets.size();      if (__first._M_cur == __last._M_cur)	return;      else if (__f_bucket == __l_bucket)	_M_erase_bucket(__f_bucket, __first._M_cur, __last._M_cur);      else	{	  _M_erase_bucket(__f_bucket, __first._M_cur, 0);	  for (size_type __n = __f_bucket + 1; __n < __l_bucket; ++__n)	    _M_erase_bucket(__n, 0);	  if (__l_bucket != _M_buckets.size())	    _M_erase_bucket(__l_bucket, __last._M_cur);	}    }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    inline void    hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    erase(const_iterator __first, const_iterator __last)    {      erase(iterator(const_cast<_Node*>(__first._M_cur),		     const_cast<hashtable*>(__first._M_ht)),	    iterator(const_cast<_Node*>(__last._M_cur),		     const_cast<hashtable*>(__last._M_ht)));    }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    inline void    hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    erase(const const_iterator& __it)    { erase(iterator(const_cast<_Node*>(__it._M_cur),		     const_cast<hashtable*>(__it._M_ht))); }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    void    hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    resize(size_type __num_elements_hint)    {      const size_type __old_n = _M_buckets.size();      if (__num_elements_hint > __old_n)	{	  const size_type __n = _M_next_size(__num_elements_hint);	  if (__n > __old_n)	    {	      _Vector_type __tmp(__n, (_Node*)(0), _M_buckets.get_allocator());	      try		{		  for (size_type __bucket = 0; __bucket < __old_n; ++__bucket)		    {		      _Node* __first = _M_buckets[__bucket];		      while (__first)			{			  size_type __new_bucket = _M_bkt_num(__first->_M_val,							      __n);			  _M_buckets[__bucket] = __first->_M_next;			  __first->_M_next = __tmp[__new_bucket];			  __tmp[__new_bucket] = __first;			  __first = _M_buckets[__bucket];			}		    }		  _M_buckets.swap(__tmp);		}	      catch(...)		{		  for (size_type __bucket = 0; __bucket < __tmp.size();		       ++__bucket)		    {		      while (__tmp[__bucket])			{			  _Node* __next = __tmp[__bucket]->_M_next;			  _M_delete_node(__tmp[__bucket]);			  __tmp[__bucket] = __next;			}		    }		  __throw_exception_again;		}	    }	}    }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    void    hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    _M_erase_bucket(const size_type __n, _Node* __first, _Node* __last)    {      _Node* __cur = _M_buckets[__n];      if (__cur == __first)	_M_erase_bucket(__n, __last);      else	{	  _Node* __next;	  for (__next = __cur->_M_next;	       __next != __first;	       __cur = __next, __next = __cur->_M_next)	    ;	  while (__next != __last)	    {	      __cur->_M_next = __next->_M_next;	      _M_delete_node(__next);	      __next = __cur->_M_next;	      --_M_num_elements;	    }	}    }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    void    hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    _M_erase_bucket(const size_type __n, _Node* __last)    {      _Node* __cur = _M_buckets[__n];      while (__cur != __last)	{	  _Node* __next = __cur->_M_next;	  _M_delete_node(__cur);	  __cur = __next;	  _M_buckets[__n] = __cur;	  --_M_num_elements;	}    }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    void    hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    clear()    {      for (size_type __i = 0; __i < _M_buckets.size(); ++__i)	{	  _Node* __cur = _M_buckets[__i];	  while (__cur != 0)	    {	      _Node* __next = __cur->_M_next;	      _M_delete_node(__cur);	      __cur = __next;	    }	  _M_buckets[__i] = 0;	}      _M_num_elements = 0;    }  template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>    void    hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::    _M_copy_from(const hashtable& __ht)    {      _M_buckets.clear();      _M_buckets.reserve(__ht._M_buckets.size());      _M_buckets.insert(_M_buckets.end(), __ht._M_buckets.size(), (_Node*) 0);      try	{	  for (size_type __i = 0; __i < __ht._M_buckets.size(); ++__i) {	    const _Node* __cur = __ht._M_buckets[__i];	    if (__cur)	      {		_Node* __local_copy = _M_new_node(__cur->_M_val);		_M_buckets[__i] = __local_copy;				for (_Node* __next = __cur->_M_next;		     __next;		     __cur = __next, __next = __cur->_M_next)		  {		    __local_copy->_M_next = _M_new_node(__next->_M_val);		    __local_copy = __local_copy->_M_next;		  }	      }	  }	  _M_num_elements = __ht._M_num_elements;	}      catch(...)	{	  clear();	  __throw_exception_again;	}    }} // namespace __gnu_cxx#undef try#undef catch#undef __throw_exception_again#pragma warning(pop)#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -