📄 hash_map
字号:
// 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 + -