📄 unordered_set
字号:
// unordered_set standard header
#pragma once
#ifndef _UNORDERED_SET_
#define _UNORDERED_SET_
#ifndef RC_INVOKED
#include <xhash>
#pragma pack(push,_CRT_PACKING)
#pragma warning(push,3)
_STD_BEGIN
namespace tr1 { // TR1 additions
// TEMPLATE CLASS _Uset_traits
template<class _Kty, // key type (same as value 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 _Uset_traits
: public _Container_base
{ // traits required to make _Hash behave like a set
public:
typedef _Kty _Val_type;
typedef _Kty key_type;
typedef _Kty 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};
_Uset_traits()
: comp()
{ // construct with default comparator
}
_Uset_traits(const _Tr& _Traits)
: comp(_Traits)
{ // construct with specified comparator
}
typedef key_compare value_compare;
static const _Kty& _Kfn(const value_type& _Val)
{ // return entire value as key
return (_Val);
}
_Tr comp; // the comparator predicate for keys
};
// TEMPLATE CLASS unordered_set
template<class _Kty,
class _Hasher = _STD tr1::hash<_Kty>,
class _Keyeq = _STD equal_to<_Kty>,
class _Alloc = _STD allocator<_Kty> >
class unordered_set
: public _Hash<_Uset_traits<_Kty,
_Hash_compare<_Kty, _Hasher, _Keyeq>, _Alloc, false> >
{ // hash table of key values, unique keys
public:
typedef unordered_set<_Kty, _Hasher, _Keyeq, _Alloc> _Myt;
typedef _Hash_compare<_Kty, _Hasher, _Keyeq> _Mytraits;
typedef _Hash<_Uset_traits<_Kty,
_Mytraits, _Alloc, false> > _Mybase;
typedef _Hasher hasher;
typedef _Kty key_type;
typedef _Keyeq key_equal;
typedef _Mytraits key_compare; // extra
// 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;
typedef typename _Mybase::iterator local_iterator;
typedef typename _Mybase::const_iterator const_local_iterator;
unordered_set()
: _Mybase(key_compare(), allocator_type())
{ // construct empty set from defaults
}
unordered_set(const _Myt& _Right)
: _Mybase(_Right)
{ // construct set by copying _Right
}
explicit unordered_set(size_type _Buckets)
: _Mybase(key_compare(), allocator_type())
{ // construct empty set from defaults, ignore initial size
this->rehash(_Buckets);
}
unordered_set(size_type _Buckets, const hasher& _Hasharg)
: _Mybase(key_compare(_Hasharg), allocator_type())
{ // construct empty set from hasher
this->rehash(_Buckets);
}
unordered_set(size_type _Buckets, const hasher& _Hasharg,
const _Keyeq& _Keyeqarg)
: _Mybase(key_compare(_Hasharg, _Keyeqarg), allocator_type())
{ // construct empty set from hasher and equality comparator
this->rehash(_Buckets);
}
unordered_set(size_type _Buckets, const hasher& _Hasharg,
const _Keyeq& _Keyeqarg, const allocator_type& _Al)
: _Mybase(key_compare(_Hasharg, _Keyeqarg), _Al)
{ // construct empty set from hasher and equality comparator
this->rehash(_Buckets);
}
template<class _Iter>
unordered_set(_Iter _First, _Iter _Last)
: _Mybase(key_compare(), allocator_type())
{ // construct set from sequence, defaults
for (; _First != _Last; ++_First)
_Mybase::insert(*_First);
}
template<class _Iter>
unordered_set(_Iter _First, _Iter _Last,
size_type _Buckets)
: _Mybase(key_compare(), allocator_type())
{ // construct set from sequence, ignore initial size
this->rehash(_Buckets);
for (; _First != _Last; ++_First)
_Mybase::insert(*_First);
}
template<class _Iter>
unordered_set(_Iter _First, _Iter _Last,
size_type _Buckets, const hasher& _Hasharg)
: _Mybase(key_compare(_Hasharg), allocator_type())
{ // construct set from sequence, comparator
this->rehash(_Buckets);
for (; _First != _Last; ++_First)
_Mybase::insert(*_First);
}
template<class _Iter>
unordered_set(_Iter _First, _Iter _Last,
size_type _Buckets, const hasher& _Hasharg,
const _Keyeq& _Keyeqarg)
: _Mybase(key_compare(_Hasharg, _Keyeqarg), allocator_type())
{ // construct set from sequence, comparator, and allocator
this->rehash(_Buckets);
for (; _First != _Last; ++_First)
_Mybase::insert(*_First);
}
template<class _Iter>
unordered_set(_Iter _First, _Iter _Last,
size_type _Buckets, const hasher& _Hasharg,
const _Keyeq& _Keyeqarg, const allocator_type& _Al)
: _Mybase(key_compare(_Hasharg, _Keyeqarg), _Al)
{ // construct set from sequence, comparator, and allocator
this->rehash(_Buckets);
for (; _First != _Last; ++_First)
_Mybase::insert(*_First);
}
_Myt& operator=(const _Myt& _Right)
{ // assign by copying _Right
_Mybase::operator=(_Right);
return (*this);
}
unordered_set(_Myt&& _Right)
: _Mybase(_STD move(_Right))
{ // construct set by moving _Right
}
_Myt& operator=(_Myt&& _Right)
{ // assign by moving _Right
_Mybase::operator=(_STD move(_Right));
return (*this);
}
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));
}
hasher hash_function() const
{ // return hasher object
return (this->comp._Hashobj);
}
key_equal key_eq() const
{ // return equality comparator object
return (this->comp._Keyeqobj);
}
#if _HAS_CPP0X
#else /* _HAS_CPP0X */
#if _HAS_STRICT_CONFORMANCE
void erase(const_iterator _Where)
{ // erase element at _Where
_Mybase::erase(_Where);
}
size_type erase(const key_type& _Keyval)
{ // erase and count all that match _Keyval
return (_Mybase::erase(_Keyval));
}
void erase(const_iterator _First, const_iterator _Last)
{ // erase [_First, _Last)
_Mybase::erase(_First, _Last);
}
#endif /* _HAS_STRICT_CONFORMANCE */
#endif /* _HAS_CPP0X */
};
template<class _Kty,
class _Hasher,
class _Keyeq,
class _Alloc>
void swap(unordered_set<_Kty, _Hasher, _Keyeq, _Alloc>& _Left,
unordered_set<_Kty, _Hasher, _Keyeq, _Alloc>& _Right)
{ // swap _Left and _Right unordered_sets
_Left.swap(_Right);
}
template<class _Kty,
class _Tr,
class _Alloc> inline
void swap(unordered_set<_Kty, _Tr, _Alloc>& _Left,
unordered_set<_Kty, _Tr, _Alloc>&& _Right)
{ // swap _Left and _Right unordered_sets
typedef unordered_set<_Kty, _Tr, _Alloc> _Myt;
_Left.swap(_STD forward<_Myt>(_Right));
}
template<class _Kty,
class _Tr,
class _Alloc> inline
void swap(unordered_set<_Kty, _Tr, _Alloc>&& _Left,
unordered_set<_Kty, _Tr, _Alloc>& _Right)
{ // swap _Left and _Right unordered_sets
typedef unordered_set<_Kty, _Tr, _Alloc> _Myt;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -