📄 set
字号:
// set standard header
#pragma once
#ifndef _SET_
#define _SET_
#ifndef RC_INVOKED
#include <xtree>
#pragma pack(push,_CRT_PACKING)
#pragma warning(push,3)
_STD_BEGIN
// TEMPLATE CLASS _Tset_traits
template<class _Kty, // key/value type
class _Pr, // comparator predicate type
class _Alloc, // actual allocator type (should be value allocator)
bool _Mfl> // true if multiple equivalent keys are permitted
class _Tset_traits
: public _Container_base
{ // traits required to make _Tree behave like a set
public:
typedef _Kty _Val_type;
typedef _Kty key_type;
typedef _Kty value_type;
typedef _Pr key_compare;
typedef typename _Alloc::template rebind<value_type>::other
allocator_type;
enum
{ // make multi parameter visible as an enumeration constant
_Multi = _Mfl};
_Tset_traits()
: comp()
{ // construct with default comparator
}
_Tset_traits(_Pr _Parg)
: comp(_Parg)
{ // construct with specified comparator
}
typedef key_compare value_compare;
static const _Kty& _Kfn(const value_type& _Val)
{ // extract key from element value
return (_Val);
}
_Pr comp; // the comparator predicate for keys
};
// TEMPLATE CLASS set
template<class _Kty,
class _Pr = less<_Kty>,
class _Alloc = allocator<_Kty> >
class set
: public _Tree<_Tset_traits<_Kty, _Pr, _Alloc, false> >
{ // ordered red-black tree of key values, unique keys
public:
typedef set<_Kty, _Pr, _Alloc> _Myt;
typedef _Tree<_Tset_traits<_Kty, _Pr, _Alloc, false> > _Mybase;
typedef _Kty key_type;
typedef _Pr 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;
set()
: _Mybase(key_compare(), allocator_type())
{ // construct empty set from defaults
}
set(const _Myt& _Right)
: _Mybase(_Right)
{ // construct set by copying _Right
}
explicit set(const key_compare& _Pred)
: _Mybase(_Pred, allocator_type())
{ // construct empty set from comparator
}
set(const key_compare& _Pred, const allocator_type& _Al)
: _Mybase(_Pred, _Al)
{ // construct empty set from comparator and allocator
}
template<class _Iter>
set(_Iter _First, _Iter _Last)
: _Mybase(key_compare(), allocator_type())
{ // construct set from [_First, _Last), defaults
this->insert(_First, _Last);
}
template<class _Iter>
set(_Iter _First, _Iter _Last,
const key_compare& _Pred)
: _Mybase(_Pred, allocator_type())
{ // construct set from [_First, _Last), comparator
this->insert(_First, _Last);
}
template<class _Iter>
set(_Iter _First, _Iter _Last,
const key_compare& _Pred, const allocator_type& _Al)
: _Mybase(_Pred, _Al)
{ // construct set from [_First, _Last), defaults, and allocator
this->insert(_First, _Last);
}
_Myt& operator=(const _Myt& _Right)
{ // assign by copying _Right
_Mybase::operator=(_Right);
return (*this);
}
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));
}
#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 _Pr,
class _Alloc> inline
void swap(set<_Kty, _Pr, _Alloc>& _Left,
set<_Kty, _Pr, _Alloc>& _Right)
{ // swap _Left and _Right sets
_Left.swap(_Right);
}
template<class _Kty,
class _Pr,
class _Alloc> inline
void swap(set<_Kty, _Pr, _Alloc>& _Left,
set<_Kty, _Pr, _Alloc>&& _Right)
{ // swap _Left and _Right sets
typedef set<_Kty, _Pr, _Alloc> _Myt;
_Left.swap(_STD forward<_Myt>(_Right));
}
template<class _Kty,
class _Pr,
class _Alloc> inline
void swap(set<_Kty, _Pr, _Alloc>&& _Left,
set<_Kty, _Pr, _Alloc>& _Right)
{ // swap _Left and _Right sets
typedef set<_Kty, _Pr, _Alloc> _Myt;
_Right.swap(_STD forward<_Myt>(_Left));
}
// TEMPLATE CLASS multiset
template<class _Kty,
class _Pr = less<_Kty>,
class _Alloc = allocator<_Kty> >
class multiset
: public _Tree<_Tset_traits<_Kty, _Pr, _Alloc, true> >
{ // ordered red-black tree of key values, non-unique keys
public:
typedef multiset<_Kty, _Pr, _Alloc> _Myt;
typedef _Tree<_Tset_traits<_Kty, _Pr, _Alloc, true> > _Mybase;
typedef _Kty key_type;
typedef _Pr 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;
multiset()
: _Mybase(key_compare(), allocator_type())
{ // construct empty set from defaults
}
multiset(const _Myt& _Right)
: _Mybase(_Right)
{ // construct set by copying _Right
}
explicit multiset(const key_compare& _Pred)
: _Mybase(_Pred, allocator_type())
{ // construct empty set from comparator
}
multiset(const key_compare& _Pred, const allocator_type& _Al)
: _Mybase(_Pred, _Al)
{ // construct empty set from comparator and allocator
}
template<class _Iter>
multiset(_Iter _First, _Iter _Last)
: _Mybase(key_compare(), allocator_type())
{ // construct set from [_First, _Last)
this->insert(_First, _Last);
}
template<class _Iter>
multiset(_Iter _First, _Iter _Last,
const key_compare& _Pred)
: _Mybase(_Pred, allocator_type())
{ // construct set from [_First, _Last), comparator
this->insert(_First, _Last);
}
template<class _Iter>
multiset(_Iter _First, _Iter _Last,
const key_compare& _Pred, const allocator_type& _Al)
: _Mybase(_Pred, _Al)
{ // construct set from [_First, _Last), comparator, and allocator
this->insert(_First, _Last);
}
_Myt& operator=(const _Myt& _Right)
{ // assign by copying _Right
_Mybase::operator=(_Right);
return (*this);
}
multiset(_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);
}
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 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));
}
#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 */
iterator insert(const value_type& _Val)
{ // insert a key value
return (_Mybase::insert(_Val).first);
}
iterator insert(const_iterator _Where, const value_type& _Val)
{ // insert a key value, with hint
return (_Mybase::insert(_Where, _Val));
}
template<class _Iter>
void insert(_Iter _First, _Iter _Last)
{ // insert [_First, _Last)
_DEBUG_RANGE(_First, _Last);
for (; _First != _Last; ++_First)
this->insert(*_First);
}
};
template<class _Kty,
class _Pr,
class _Alloc> inline
void swap(multiset<_Kty, _Pr, _Alloc>& _Left,
multiset<_Kty, _Pr, _Alloc>& _Right)
{ // swap _Left and _Right multisets
_Left.swap(_Right);
}
template<class _Kty,
class _Pr,
class _Alloc> inline
void swap(multiset<_Kty, _Pr, _Alloc>& _Left,
multiset<_Kty, _Pr, _Alloc>&& _Right)
{ // swap _Left and _Right multisets
typedef multiset<_Kty, _Pr, _Alloc> _Myt;
_Left.swap(_STD forward<_Myt>(_Right));
}
template<class _Kty,
class _Pr,
class _Alloc> inline
void swap(multiset<_Kty, _Pr, _Alloc>&& _Left,
multiset<_Kty, _Pr, _Alloc>& _Right)
{ // swap _Left and _Right multisets
typedef multiset<_Kty, _Pr, _Alloc> _Myt;
_Right.swap(_STD forward<_Myt>(_Left));
}
_STD_END
#pragma warning(pop)
#pragma pack(pop)
#endif /* RC_INVOKED */
#endif /* _SET_ */
/*
* 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 + -