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

📄 hash_map

📁 C语言库函数的原型,有用的拿去
💻
字号:
// hash_map standard header
#pragma once
#ifndef _HASH_MAP_
#define _HASH_MAP_
#ifndef RC_INVOKED
#include <xhash>

 #pragma pack(push,_CRT_PACKING)
 #pragma warning(push,3)
_STD_BEGIN
		// TEMPLATE CLASS _Hmap_traits
template<class _Kty,	// key type
	class _Ty,	// mapped type
	class _Tr,	// comparator predicate type
	class _Alloc,	// actual allocator type (should be value allocator)
	bool _Mfl>	// true if multiple equivalent keys are permitted
	class _Hmap_traits
		: public _Container_base
	{	// traits required to make _Hash behave like a map
public:
	typedef pair<_Kty, _Ty> _Val_type;
	typedef _Kty key_type;
	typedef pair<const _Kty, _Ty> value_type;
	typedef _Tr key_compare;

	typedef typename _Alloc::template rebind<value_type>::other
		allocator_type;

	enum
		{	// make multi parameter visible as an enum constant
		_Multi = _Mfl};

	_Hmap_traits()
		: comp()
		{	// construct with default comparator
		}

	_Hmap_traits(const _Tr& _Traits)
		: comp(_Traits)
		{	// construct with specified comparator
		}

	class value_compare
		: public binary_function<value_type, value_type, bool>
		{	// functor for comparing two element values
		friend class _Hmap_traits<_Kty, _Ty, _Tr, _Alloc, _Mfl>;

	public:
		bool operator()(const value_type& _Left,
			const value_type& _Right) const
			{	// test if _Left precedes _Right by comparing just keys
			return (comp(_Left.first, _Right.first));
			}

		value_compare(const key_compare& _Traits)
			: comp(_Traits)
			{	// construct with specified predicate
			}

	protected:
		key_compare comp;	// the comparator predicate for keys
		};

	template<class _Ty1,
		class _Ty2>
		static const _Kty& _Kfn(const _STD pair<_Ty1, _Ty2>& _Val)
		{	// extract key from element value
		return (_Val.first);
		}

	_Tr comp;	// the comparator predicate for keys
	};
_STD_END
namespace stdext {
using _STD allocator;
using _STD pair;
using _STD _Hash;
using _STD _Hmap_traits;
using _STD _Xout_of_range;

#if _ITERATOR_DEBUG_LEVEL == 2
  using _STD _Debug_range;
#endif
		// TEMPLATE CLASS hash_map
template<class _Kty,
	class _Ty,
	class _Tr = hash_compare<_Kty, less<_Kty> >,
	class _Alloc = allocator<pair<const _Kty, _Ty> > >
	class hash_map
		: public _Hash<_Hmap_traits<_Kty, _Ty, _Tr, _Alloc, false> >
	{	// hash table of {key, mapped} values, unique keys
public:
	typedef hash_map<_Kty, _Ty, _Tr, _Alloc> _Myt;
	typedef _Hash<_Hmap_traits<_Kty, _Ty, _Tr, _Alloc, false> > _Mybase;
	typedef _Kty key_type;
	typedef _Ty mapped_type;
	typedef _Ty referent_type;
	typedef _Tr key_compare;
	typedef typename _Mybase::value_compare value_compare;
	typedef typename _Mybase::allocator_type allocator_type;
	typedef typename _Mybase::size_type size_type;
	typedef typename _Mybase::difference_type difference_type;
	typedef typename _Mybase::pointer pointer;
	typedef typename _Mybase::const_pointer const_pointer;
	typedef typename _Mybase::reference reference;
	typedef typename _Mybase::const_reference const_reference;
	typedef typename _Mybase::iterator iterator;
	typedef typename _Mybase::const_iterator const_iterator;
	typedef typename _Mybase::reverse_iterator reverse_iterator;
	typedef typename _Mybase::const_reverse_iterator
		const_reverse_iterator;
	typedef typename _Mybase::value_type value_type;

	hash_map()
		: _Mybase(key_compare(), allocator_type())
		{	// construct empty map from defaults
		}

	hash_map(const _Myt& _Right)
		: _Mybase(_Right)
		{	// construct map by copying _Right
		}

	explicit hash_map(const key_compare& _Traits)
		: _Mybase(_Traits, allocator_type())
		{	// construct empty map from comparator
		}

	hash_map(const key_compare& _Traits, const allocator_type& _Al)
		: _Mybase(_Traits, _Al)
		{	// construct empty map from comparator and allocator
		}

	template<class _Iter>
		hash_map(_Iter _First, _Iter _Last)
		: _Mybase(key_compare(), allocator_type())
		{	// construct map from sequence, defaults
		_DEBUG_RANGE(_First, _Last);
		for (; _First != _Last; ++_First)
			this->insert(*_First);
		}

	template<class _Iter>
		hash_map(_Iter _First, _Iter _Last,
			const key_compare& _Traits)
		: _Mybase(_Traits, allocator_type())
		{	// construct map from sequence, comparator
		_DEBUG_RANGE(_First, _Last);
		for (; _First != _Last; ++_First)
			this->insert(*_First);
		}

	template<class _Iter>
		hash_map(_Iter _First, _Iter _Last,
			const key_compare& _Traits,
			const allocator_type& _Al)
		: _Mybase(_Traits, _Al)
		{	// construct map from sequence, comparator, and allocator
		_DEBUG_RANGE(_First, _Last);
		for (; _First != _Last; ++_First)
			this->insert(*_First);
		}

	_Myt& operator=(const _Myt& _Right)
		{	// assign by copying _Right
		_Mybase::operator=(_Right);
		return (*this);
		}

	hash_map(_Myt&& _Right)
		: _Mybase(_STD move(_Right))
		{	// construct map by moving _Right
		}

	_Myt& operator=(_Myt&& _Right)
		{	// assign by moving _Right
		_Mybase::operator=(_STD move(_Right));
		return (*this);
		}

	mapped_type& operator[](key_type&& _Keyval)
		{	// find element matching _Keyval or insert with default mapped
		iterator _Where = this->lower_bound(_Keyval);
		if (_Where == this->end())
			_Where = this->insert(
				_STD pair<key_type, mapped_type>(
					_STD move(_Keyval),
					mapped_type())).first;
		return ((*_Where).second);
		}

	void swap(_Myt& _Right)
		{	// exchange contents with non-movable _Right
		_Mybase::swap(_Right);
		}

	void swap(_Myt&& _Right)
		{	// exchange contents with movable _Right
		_Mybase::swap(_STD move(_Right));
		}

	mapped_type& operator[](const key_type& _Keyval)
		{	// find element matching _Keyval or insert with default mapped
		iterator _Where = this->lower_bound(_Keyval);
		if (_Where == this->end())
			_Where = this->insert(value_type(_Keyval, mapped_type())).first;
		return ((*_Where).second);
		}

 #if _HAS_CPP0X
	mapped_type& at(const key_type& _Keyval)
		{	// find element matching _Keyval
		iterator _Where = this->lower_bound(_Keyval);
		if (_Where == this->end())
			_Xout_of_range("invalid hash_map<K, T> key");
		return ((*_Where).second);
		}

	const mapped_type& at(const key_type& _Keyval) const
		{	// find element matching _Keyval
		const_iterator _Where = this->lower_bound(_Keyval);
		if (_Where == this->end())
			_Xout_of_range("invalid hash_map<K, T> key");
		return ((*_Where).second);
		}
 #endif /* _HAS_CPP0X */
	};

template<class _Kty,
	class _Ty,
	class _Tr,
	class _Alloc> inline
	void swap(hash_map<_Kty, _Ty, _Tr, _Alloc>& _Left,
		hash_map<_Kty, _Ty, _Tr, _Alloc>& _Right)
	{	// swap _Left and _Right hash_maps
	_Left.swap(_Right);
	}

template<class _Kty,
	class _Ty,
	class _Tr,
	class _Alloc> inline
	void swap(hash_map<_Kty, _Ty, _Tr, _Alloc>& _Left,
		hash_map<_Kty, _Ty, _Tr, _Alloc>&& _Right)
	{	// swap _Left and _Right hash_maps
	typedef hash_map<_Kty, _Ty, _Tr, _Alloc> _Myt;
	_Left.swap(_STD forward<_Myt>(_Right));
	}

template<class _Kty,
	class _Ty,
	class _Tr,
	class _Alloc> inline
	void swap(hash_map<_Kty, _Ty, _Tr, _Alloc>&& _Left,
		hash_map<_Kty, _Ty, _Tr, _Alloc>& _Right)
	{	// swap _Left and _Right hash_maps
	typedef hash_map<_Kty, _Ty, _Tr, _Alloc> _Myt;
	_Right.swap(_STD forward<_Myt>(_Left));
	}
}	// namespace stdext
_STD_BEGIN
using stdext::hash_map;
_STD_END
namespace stdext {

		// TEMPLATE CLASS hash_multimap
template<class _Kty,
	class _Ty,
	class _Tr = hash_compare<_Kty, less<_Kty> >,
	class _Alloc = allocator<pair<const _Kty, _Ty> > >
	class hash_multimap
		: public _Hash<_Hmap_traits<_Kty, _Ty, _Tr, _Alloc, true> >
	{	// hash table of {key, mapped} values, non-unique keys
public:
	typedef hash_multimap<_Kty, _Ty, _Tr, _Alloc> _Myt;
	typedef _Hash<_Hmap_traits<_Kty, _Ty, _Tr, _Alloc, true> > _Mybase;
	typedef _Kty key_type;
	typedef _Ty mapped_type;
	typedef _Ty referent_type;	// old name, magically gone
	typedef _Tr key_compare;
	typedef typename _Mybase::value_compare value_compare;
	typedef typename _Mybase::allocator_type allocator_type;
	typedef typename _Mybase::size_type size_type;
	typedef typename _Mybase::difference_type difference_type;
	typedef typename _Mybase::pointer pointer;
	typedef typename _Mybase::const_pointer const_pointer;
	typedef typename _Mybase::reference reference;
	typedef typename _Mybase::const_reference const_reference;
	typedef typename _Mybase::iterator iterator;
	typedef typename _Mybase::const_iterator const_iterator;
	typedef typename _Mybase::reverse_iterator reverse_iterator;
	typedef typename _Mybase::const_reverse_iterator
		const_reverse_iterator;
	typedef typename _Mybase::value_type value_type;

	hash_multimap()
		: _Mybase(key_compare(), allocator_type())
		{	// construct empty map from defaults
		}

	hash_multimap(const _Myt& _Right)
		: _Mybase(_Right)
		{	// construct map by copying _Right
		}

	explicit hash_multimap(const key_compare& _Traits)
		: _Mybase(_Traits, allocator_type())
		{	// construct empty map from comparator
		}

	hash_multimap(const key_compare& _Traits,
		const allocator_type& _Al)
		: _Mybase(_Traits, _Al)
		{	// construct empty map from comparator and allocator
		}

	template<class _Iter>
		hash_multimap(_Iter _First, _Iter _Last)
		: _Mybase(key_compare(), allocator_type())
		{	// construct map from sequence, defaults
		_DEBUG_RANGE(_First, _Last);
		for (; _First != _Last; ++_First)
			this->insert(*_First);
		}

	template<class _Iter>
		hash_multimap(_Iter _First, _Iter _Last,
			const key_compare& _Traits)
		: _Mybase(_Traits, allocator_type())
		{	// construct map from sequence, comparator
		_DEBUG_RANGE(_First, _Last);
		for (; _First != _Last; ++_First)
			this->insert(*_First);
		}

	template<class _Iter>
		hash_multimap(_Iter _First, _Iter _Last,
			const key_compare& _Traits,
			const allocator_type& _Al)
		: _Mybase(_Traits, _Al)
		{	// construct map from sequence, comparator, and allocator
		_DEBUG_RANGE(_First, _Last);
		for (; _First != _Last; ++_First)
			this->insert(*_First);
		}

	_Myt& operator=(const _Myt& _Right)
		{	// assign by copying _Right
		_Mybase::operator=(_Right);
		return (*this);
		}

	hash_multimap(_Myt&& _Right)
		: _Mybase(_STD move(_Right))
		{	// construct map by moving _Right
		}

	_Myt& operator=(_Myt&& _Right)
		{	// assign by moving _Right
		_Mybase::operator=(_STD move(_Right));
		return (*this);
		}

	template<class _Valty>
		iterator insert(_Valty&& _Val)
		{	// insert a {key, mapped} value
		return (_Mybase::insert(_STD forward<_Valty>(_Val)).first);
		}

	template<class _Valty>
		typename _STD tr1::enable_if<!_STD tr1::is_same<const_iterator,
			typename _STD tr1::remove_reference<_Valty>::type>::value,
				iterator>::type
		insert(const_iterator _Where, _Valty&& _Val)
		{	// insert a {key, mapped} value, with hint
		return (_Mybase::insert(_Where, _STD forward<_Valty>(_Val)));
		}

	void swap(_Myt& _Right)
		{	// exchange contents with non-movable _Right
		_Mybase::swap(_Right);
		}

	void swap(_Myt&& _Right)
		{	// exchange contents with movable _Right
		_Mybase::swap(_STD move(_Right));
		}

	iterator insert(const value_type& _Val)
		{	// insert a {key, mapped} value
		return (_Mybase::insert(_Val).first);
		}

	iterator insert(const_iterator _Where, const value_type& _Val)
		{	// insert a {key, mapped} value, with hint
		return (_Mybase::insert(_Where, _Val));
		}

	template<class _Iter>
		void insert(_Iter _First, _Iter _Last)
		{	// insert [_First, _Last), arbitrary iterators
		_DEBUG_RANGE(_First, _Last);
		this->_Mybase::insert(_First, _Last);
		}
	};

template<class _Kty,
	class _Ty,
	class _Tr,
	class _Alloc> inline
	void swap(hash_multimap<_Kty, _Ty, _Tr, _Alloc>& _Left,
		hash_multimap<_Kty, _Ty, _Tr, _Alloc>& _Right)
	{	// swap _Left and _Right hash_multimaps
	_Left.swap(_Right);
	}

template<class _Kty,
	class _Ty,
	class _Tr,
	class _Alloc> inline
	void swap(hash_multimap<_Kty, _Ty, _Tr, _Alloc>& _Left,
		hash_multimap<_Kty, _Ty, _Tr, _Alloc>&& _Right)
	{	// swap _Left and _Right hash_multimaps
	typedef hash_multimap<_Kty, _Ty, _Tr, _Alloc> _Myt;
	_Left.swap(_STD forward<_Myt>(_Right));
	}

template<class _Kty,
	class _Ty,
	class _Tr,
	class _Alloc> inline
	void swap(hash_multimap<_Kty, _Ty, _Tr, _Alloc>&& _Left,
		hash_multimap<_Kty, _Ty, _Tr, _Alloc>& _Right)
	{	// swap _Left and _Right hash_multimaps
	typedef hash_multimap<_Kty, _Ty, _Tr, _Alloc> _Myt;
	_Right.swap(_STD forward<_Myt>(_Left));
	}
}	// namespace stdext
_STD_BEGIN
using stdext::hash_multimap;
_STD_END

 #pragma warning(pop)
 #pragma pack(pop)

#endif /* RC_INVOKED */
#endif /* _HASH_MAP_ */

/*
 * Copyright (c) 1992-2009 by P.J. Plauger.  ALL RIGHTS RESERVED.
 * Consult your license regarding permissions and restrictions.
V5.20:0009 */

⌨️ 快捷键说明

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