📄 stl_hashtable.h
字号:
__result += 1; return __result; } pair<iterator, bool> insert_unique(const value_type& __obj) { resize(_M_num_elements + 1); return insert_unique_noresize(__obj); } iterator insert_equal(const value_type& __obj) { resize(_M_num_elements + 1); return insert_equal_noresize(__obj); } pair<iterator, bool> insert_unique_noresize(const value_type& __obj); iterator insert_equal_noresize(const value_type& __obj); #ifdef __STL_MEMBER_TEMPLATES template <class _InputIterator> void insert_unique(_InputIterator __f, _InputIterator __l) { insert_unique(__f, __l, __ITERATOR_CATEGORY(__f)); } template <class _InputIterator> void insert_equal(_InputIterator __f, _InputIterator __l) { insert_equal(__f, __l, __ITERATOR_CATEGORY(__f)); } template <class _InputIterator> void insert_unique(_InputIterator __f, _InputIterator __l, input_iterator_tag) { for ( ; __f != __l; ++__f) insert_unique(*__f); } template <class _InputIterator> void insert_equal(_InputIterator __f, _InputIterator __l, input_iterator_tag) { for ( ; __f != __l; ++__f) insert_equal(*__f); } template <class _ForwardIterator> void insert_unique(_ForwardIterator __f, _ForwardIterator __l, forward_iterator_tag) { size_type __n = 0; distance(__f, __l, __n); resize(_M_num_elements + __n); for ( ; __n > 0; --__n, ++__f) insert_unique_noresize(*__f); } template <class _ForwardIterator> void insert_equal(_ForwardIterator __f, _ForwardIterator __l, forward_iterator_tag) { size_type __n = 0; distance(__f, __l, __n); resize(_M_num_elements + __n); for ( ; __n > 0; --__n, ++__f) insert_equal_noresize(*__f); }#else /* __STL_MEMBER_TEMPLATES */ void insert_unique(const value_type* __f, const value_type* __l) { size_type __n = __l - __f; resize(_M_num_elements + __n); for ( ; __n > 0; --__n, ++__f) insert_unique_noresize(*__f); } void insert_equal(const value_type* __f, const value_type* __l) { size_type __n = __l - __f; resize(_M_num_elements + __n); for ( ; __n > 0; --__n, ++__f) insert_equal_noresize(*__f); } void insert_unique(const_iterator __f, const_iterator __l) { size_type __n = 0; distance(__f, __l, __n); resize(_M_num_elements + __n); for ( ; __n > 0; --__n, ++__f) insert_unique_noresize(*__f); } void insert_equal(const_iterator __f, const_iterator __l) { size_type __n = 0; distance(__f, __l, __n); resize(_M_num_elements + __n); for ( ; __n > 0; --__n, ++__f) insert_equal_noresize(*__f); }#endif /*__STL_MEMBER_TEMPLATES */ reference find_or_insert(const value_type& __obj); iterator find(const key_type& __key) { size_type __n = _M_bkt_num_key(__key); _Node* __first; for ( __first = _M_buckets[__n]; __first && !_M_equals(_M_get_key(__first->_M_val), __key); __first = __first->_M_next) {} return iterator(__first, this); } const_iterator find(const key_type& __key) const { size_type __n = _M_bkt_num_key(__key); const _Node* __first; for ( __first = _M_buckets[__n]; __first && !_M_equals(_M_get_key(__first->_M_val), __key); __first = __first->_M_next) {} return const_iterator(__first, this); } size_type count(const key_type& __key) const { const size_type __n = _M_bkt_num_key(__key); size_type __result = 0; for (const _Node* __cur = _M_buckets[__n]; __cur; __cur = __cur->_M_next) if (_M_equals(_M_get_key(__cur->_M_val), __key)) ++__result; return __result; } pair<iterator, iterator> equal_range(const key_type& __key); pair<const_iterator, const_iterator> equal_range(const key_type& __key) const; size_type erase(const key_type& __key); void erase(const iterator& __it); void erase(iterator __first, iterator __last); void erase(const const_iterator& __it); void erase(const_iterator __first, const_iterator __last); void resize(size_type __num_elements_hint); void clear();private: size_type _M_next_size(size_type __n) const { return __stl_next_prime(__n); } void _M_initialize_buckets(size_type __n) { const size_type __n_buckets = _M_next_size(__n); _M_buckets.reserve(__n_buckets); _M_buckets.insert(_M_buckets.end(), __n_buckets, (_Node*) 0); _M_num_elements = 0; } size_type _M_bkt_num_key(const key_type& __key) const { return _M_bkt_num_key(__key, _M_buckets.size()); } size_type _M_bkt_num(const value_type& __obj) const { return _M_bkt_num_key(_M_get_key(__obj)); } size_type _M_bkt_num_key(const key_type& __key, size_t __n) const { return _M_hash(__key) % __n; } size_type _M_bkt_num(const value_type& __obj, size_t __n) const { return _M_bkt_num_key(_M_get_key(__obj), __n); } _Node* _M_new_node(const value_type& __obj) { _Node* __n = _M_get_node(); __n->_M_next = 0; __STL_TRY { construct(&__n->_M_val, __obj); return __n; } __STL_UNWIND(_M_put_node(__n)); } void _M_delete_node(_Node* __n) { destroy(&__n->_M_val); _M_put_node(__n); } void _M_erase_bucket(const size_type __n, _Node* __first, _Node* __last); void _M_erase_bucket(const size_type __n, _Node* __last); void _M_copy_from(const hashtable& __ht);};template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>_Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>&_Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>::operator++(){ const _Node* __old = _M_cur; _M_cur = _M_cur->_M_next; if (!_M_cur) { size_type __bucket = _M_ht->_M_bkt_num(__old->_M_val); while (!_M_cur && ++__bucket < _M_ht->_M_buckets.size()) _M_cur = _M_ht->_M_buckets[__bucket]; } return *this;}template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>inline _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>_Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>::operator++(int){ iterator __tmp = *this; ++*this; return __tmp;}template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>_Hashtable_const_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>&_Hashtable_const_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>::operator++(){ const _Node* __old = _M_cur; _M_cur = _M_cur->_M_next; if (!_M_cur) { size_type __bucket = _M_ht->_M_bkt_num(__old->_M_val); while (!_M_cur && ++__bucket < _M_ht->_M_buckets.size()) _M_cur = _M_ht->_M_buckets[__bucket]; } return *this;}template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>inline _Hashtable_const_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>_Hashtable_const_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>::operator++(int){ const_iterator __tmp = *this; ++*this; return __tmp;}#ifndef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>inline forward_iterator_tagiterator_category(const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>&){ return forward_iterator_tag();}template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>inline _Val* value_type(const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>&){ return (_Val*) 0;}template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>inline hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::difference_type*distance_type(const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>&){ return (hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::difference_type*) 0;}template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>inline forward_iterator_tagiterator_category(const _Hashtable_const_iterator<_Val,_Key,_HF, _ExK,_EqK,_All>&){ return forward_iterator_tag();}template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>inline _Val* value_type(const _Hashtable_const_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>&){ return (_Val*) 0;}template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>inline hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::difference_type*distance_type(const _Hashtable_const_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>&){ return (hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::difference_type*) 0;}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>bool operator==(const hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>& __ht1, const hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>& __ht2){ typedef typename hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::_Node _Node; if (__ht1._M_buckets.size() != __ht2._M_buckets.size()) return false; for (int __n = 0; __n < __ht1._M_buckets.size(); ++__n) { _Node* __cur1 = __ht1._M_buckets[__n]; _Node* __cur2 = __ht2._M_buckets[__n]; for ( ; __cur1 && __cur2 && __cur1->_M_val == __cur2->_M_val; __cur1 = __cur1->_M_next, __cur2 = __cur2->_M_next) {} if (__cur1 || __cur2) return false; } return true;} #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDERtemplate <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>inline bool operator!=(const hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>& __ht1, const hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>& __ht2) { return !(__ht1 == __ht2);}template <class _Val, class _Key, class _HF, class _Extract, class _EqKey, class _All>inline void swap(hashtable<_Val, _Key, _HF, _Extract, _EqKey, _All>& __ht1, hashtable<_Val, _Key, _HF, _Extract, _EqKey, _All>& __ht2) { __ht1.swap(__ht2);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -