?? algorithm
字號:
class _Pr> inline
_OutTy *remove_copy_if(_InIt _First, _InIt _Last,
_OutTy (&_Dest)[_OutSize], _Pr _Pred)
{ // copy omitting each element satisfying _Pred, array dest
return (_Unchecked(
_STD remove_copy_if(_First, _Last,
_Array_iterator<_OutTy, _OutSize>(_Dest), _Pred)));
}
#endif /* _ITERATOR_DEBUG_LEVEL == 0 */
// TEMPLATE FUNCTION remove
template<class _FwdIt,
class _Ty> inline
_FwdIt _Remove(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
{ // remove each matching _Val
_FwdIt _Next = _First;
for (++_First; _First != _Last; ++_First)
if (!(*_First == _Val))
*_Next++ = _Move(*_First);
return (_Next);
}
template<class _FwdIt,
class _Ty> inline
_FwdIt remove(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
{ // remove each matching _Val
_First = _STD find(_First, _Last, _Val);
if (_First == _Last)
return (_First); // empty sequence, all done
else
return (_Rechecked(_First,
_Remove(_Unchecked(_First), _Unchecked(_Last), _Val)));
}
// TEMPLATE FUNCTION remove_if
template<class _FwdIt,
class _Pr> inline
_FwdIt _Remove_if(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
{ // remove each satisfying _Pred
_FwdIt _Next = _First;
for (++_First; _First != _Last; ++_First)
if (!_Pred(*_First))
*_Next++ = _Move(*_First);
return (_Next);
}
template<class _FwdIt,
class _Pr> inline
_FwdIt remove_if(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
{ // remove each satisfying _Pred
_First = _STD find_if(_First, _Last, _Pred);
if (_First == _Last)
return (_First); // empty sequence, all done
else
return (_Rechecked(_First,
_Remove_if(_Unchecked(_First), _Unchecked(_Last), _Pred)));
}
// TEMPLATE FUNCTION unique
template<class _FwdIt> inline
_FwdIt _Unique(_FwdIt _First, _FwdIt _Last)
{ // remove each matching previous
if (_First != _Last)
for (_FwdIt _Firstb; (_Firstb = _First), ++_First != _Last; )
if (*_Firstb == *_First)
{ // copy down
for (; ++_First != _Last; )
if (!(*_Firstb == *_First))
*++_Firstb = _Move(*_First);
return (++_Firstb);
}
return (_Last);
}
template<class _FwdIt> inline
_FwdIt unique(_FwdIt _First, _FwdIt _Last)
{ // remove each matching previous
_DEBUG_RANGE(_First, _Last);
return (_Rechecked(_First,
_Unique(_Unchecked(_First), _Unchecked(_Last))));
}
// TEMPLATE FUNCTION unique WITH PRED
template<class _FwdIt,
class _Pr> inline
_FwdIt _Unique(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
{ // remove each satisfying _Pred with previous
if (_First != _Last)
for (_FwdIt _Firstb; (_Firstb = _First), ++_First != _Last; )
if (_Pred(*_Firstb, *_First))
{ // copy down
for (; ++_First != _Last; )
if (!_Pred(*_Firstb, *_First))
*++_Firstb = _Move(*_First);
return (++_Firstb);
}
return (_Last);
}
template<class _FwdIt,
class _Pr> inline
_FwdIt unique(_FwdIt _First, _FwdIt _Last, _Pr _Pred)
{ // remove each satisfying _Pred with previous
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Pred);
return (_Rechecked(_First,
_Unique(_Unchecked(_First), _Unchecked(_Last), _Pred)));
}
// TEMPLATE FUNCTION unique_copy
template<class _InIt,
class _OutIt,
class _Ty> inline
_OutIt _Unique_copy(_InIt _First, _InIt _Last,
_OutIt _Dest, _Ty *)
{ // copy compressing pairs that match, input iterators
_Ty _Val = *_First;
for (*_Dest++ = _Val; ++_First != _Last; )
if (!(_Val == *_First))
{ // copy unmatched
_Val = *_First;
*_Dest++ = _Val;
}
return (_Dest);
}
template<class _InIt,
class _OutIt> inline
_OutIt _Unique_copy(_InIt _First, _InIt _Last,
_OutIt _Dest, input_iterator_tag)
{ // copy compressing pairs that match, input iterators
return (_Unique_copy(_First, _Last, _Dest,
_Val_type(_First)));
}
template<class _FwdIt,
class _OutIt> inline
_OutIt _Unique_copy(_FwdIt _First, _FwdIt _Last,
_OutIt _Dest, forward_iterator_tag)
{ // copy compressing pairs that match, forward iterators
_FwdIt _Firstb = _First;
for (*_Dest++ = *_Firstb; ++_First != _Last; )
if (!(*_Firstb == *_First))
{ // copy unmatched
_Firstb = _First;
*_Dest++ = *_Firstb;
}
return (_Dest);
}
#if _ITERATOR_DEBUG_LEVEL == 0
template<class _InIt,
class _OutIt> inline
_OutIt unique_copy(_InIt _First, _InIt _Last,
_OutIt _Dest)
{ // copy compressing pairs that match
return (_First == _Last ? _Dest :
_Unique_copy(_Unchecked(_First), _Unchecked(_Last),
_Dest, _Iter_cat(_First)));
}
#else /* _ITERATOR_DEBUG_LEVEL == 0 */
template<class _InIt,
class _OutIt> inline
_OutIt _Unique_copy1(_InIt _First, _InIt _Last,
_OutIt _Dest, _STD tr1::true_type)
{ // copy compressing pairs that match, checked dest
return (_Unique_copy(_First, _Last,
_Dest, _Iter_cat(_First)));
}
template<class _InIt,
class _OutIt> inline
_SCL_INSECURE_DEPRECATE
_OutIt _Unique_copy1(_InIt _First, _InIt _Last,
_OutIt _Dest, _STD tr1::false_type)
{ // copy compressing pairs that match, unchecked dest
return (_Unique_copy(_First, _Last,
_Dest, _Iter_cat(_First)));
}
template<class _InIt,
class _OutIt> inline
_OutIt unique_copy(_InIt _First, _InIt _Last,
_OutIt _Dest)
{ // copy compressing pairs that match
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
return (_First == _Last ? _Dest :
_Unique_copy1(_Unchecked(_First), _Unchecked(_Last),
_Dest, _Is_checked(_Dest)));
}
template<class _InIt,
class _OutTy,
size_t _OutSize> inline
_OutTy *unique_copy(_InIt _First, _InIt _Last,
_OutTy (&_Dest)[_OutSize])
{ // copy compressing pairs that match, array dest
return (_Unchecked(
_STD unique_copy(_First, _Last,
_Array_iterator<_OutTy, _OutSize>(_Dest))));
}
#endif /* _ITERATOR_DEBUG_LEVEL == 0 */
// TEMPLATE FUNCTION unique_copy WITH PRED
template<class _InIt,
class _OutIt,
class _Ty,
class _Pr> inline
_OutIt _Unique_copy(_InIt _First, _InIt _Last,
_OutIt _Dest, _Pr _Pred, _Ty *)
{ // copy compressing pairs satisfying _Pred, input iterators
_Ty _Val = *_First;
for (*_Dest++ = _Val; ++_First != _Last; )
if (!_Pred(_Val, *_First))
{ // copy unmatched
_Val = *_First;
*_Dest++ = _Val;
}
return (_Dest);
}
template<class _InIt,
class _OutIt,
class _Pr> inline
_OutIt _Unique_copy(_InIt _First, _InIt _Last,
_OutIt _Dest, _Pr _Pred, input_iterator_tag)
{ // copy compressing pairs satisfying _Pred, input iterators
return (_Unique_copy(_First, _Last, _Dest, _Pred,
_Val_type(_First)));
}
template<class _FwdIt,
class _OutIt,
class _Pr> inline
_OutIt _Unique_copy(_FwdIt _First, _FwdIt _Last,
_OutIt _Dest, _Pr _Pred, forward_iterator_tag)
{ // copy compressing pairs satisfying _Pred, forward iterators
_FwdIt _Firstb = _First;
for (*_Dest++ = *_Firstb; ++_First != _Last; )
if (!_Pred(*_Firstb, *_First))
{ // copy unmatched
_Firstb = _First;
*_Dest++ = *_Firstb;
}
return (_Dest);
}
#if _ITERATOR_DEBUG_LEVEL == 0
template<class _InIt,
class _OutIt,
class _Pr> inline
_OutIt unique_copy(_InIt _First, _InIt _Last,
_OutIt _Dest, _Pr _Pred)
{ // copy compressing pairs that match
return (_First == _Last ? _Dest :
_Unique_copy(_Unchecked(_First), _Unchecked(_Last),
_Dest, _Pred, _Iter_cat(_First)));
}
#else /* _ITERATOR_DEBUG_LEVEL == 0 */
template<class _InIt,
class _OutIt,
class _Pr> inline
_OutIt _Unique_copy1(_InIt _First, _InIt _Last,
_OutIt _Dest, _Pr _Pred, _STD tr1::true_type)
{ // copy compressing pairs that match, checked dest
return (_Unique_copy(_First, _Last,
_Dest, _Pred, _Iter_cat(_First)));
}
template<class _InIt,
class _OutIt,
class _Pr> inline
_SCL_INSECURE_DEPRECATE
_OutIt _Unique_copy1(_InIt _First, _InIt _Last,
_OutIt _Dest, _Pr _Pred, _STD tr1::false_type)
{ // copy compressing pairs that match, unchecked dest
return (_Unique_copy(_First, _Last,
_Dest, _Pred, _Iter_cat(_First)));
}
template<class _InIt,
class _OutIt,
class _Pr> inline
_OutIt unique_copy(_InIt _First, _InIt _Last,
_OutIt _Dest, _Pr _Pred)
{ // copy compressing pairs that match
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
return (_First == _Last ? _Dest :
_Unique_copy1(_Unchecked(_First), _Unchecked(_Last),
_Dest, _Pred, _Is_checked(_Dest)));
}
template<class _InIt,
class _OutTy,
size_t _OutSize,
class _Pr> inline
_OutTy *unique_copy(_InIt _First, _InIt _Last,
_OutTy (&_Dest)[_OutSize], _Pr _Pred)
{ // copy compressing pairs that match, array dest
return (_Unchecked(
_STD unique_copy(_First, _Last,
_Array_iterator<_OutTy, _OutSize>(_Dest), _Pred)));
}
#endif /* _ITERATOR_DEBUG_LEVEL == 0 */
// TEMPLATE FUNCTION reverse_copy
template<class _BidIt,
class _OutIt> inline
_OutIt _Reverse_copy(_BidIt _First, _BidIt _Last,
_OutIt _Dest)
{ // copy reversing elements in [_First, _Last)
for (; _First != _Last; ++_Dest)
*_Dest = *--_Last;
return (_Dest);
}
#if _ITERATOR_DEBUG_LEVEL == 0
template<class _BidIt,
class _OutIt> inline
_OutIt reverse_copy(_BidIt _First, _BidIt _Last,
_OutIt _Dest)
{ // copy reversing elements in [_First, _Last)
return (_Reverse_copy(_Unchecked(_First), _Unchecked(_Last),
_Dest));
}
#else /* _ITERATOR_DEBUG_LEVEL == 0 */
template<class _BidIt,
class _OutIt> inline
_OutIt _Reverse_copy(_BidIt _First, _BidIt _Last,
_OutIt _Dest,
input_iterator_tag, output_iterator_tag)
{ // copy reversing elements in [_First, _Last), arbitrary iterators
return (_Reverse_copy(_First, _Last,
_Dest));
}
template<class _BidIt,
class _OutIt> inline
_OutIt _Reverse_copy(_BidIt _First, _BidIt _Last,
_OutIt _Dest,
random_access_iterator_tag, random_access_iterator_tag)
{ // copy reversing elements in [_First, _Last), random-access iterators
_OutIt _Ans = _Dest + (_Last - _First); // also checks range
_Reverse_copy(_First, _Last,
_Unchecked(_Dest));
return (_Ans);
}
template<class _BidIt,
class _OutIt> inline
_OutIt _Reverse_copy(_BidIt _First, _BidIt _Last,
_OutIt _Dest,
_STD tr1::true_type)
{ // copy reversing elements in [_First, _Last), checked dest
return (_Reverse_copy(_First, _Last,
_Dest, _Iter_cat(_First), _Iter_cat(_Dest)));
}
template<class _BidIt,
class _OutIt> inline
_SCL_INSECURE_DEPRECATE
_OutIt _Reverse_copy(_BidIt _First, _BidIt _Last,
_OutIt _Dest,
_STD tr1::false_type)
{ // copy reversing elements in [_First, _Last), unchecked dest
return (_Reverse_copy(_First, _Last,
_Dest, _Iter_cat(_First), _Iter_cat(_Dest)));
}
template<class _BidIt,
class _OutIt> inline
_OutIt reverse_copy(_BidIt _First, _BidIt _Last,
_OutIt _Dest)
{ // copy reversing elements in [_First, _Last)
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
return (_Reverse_copy(_Unchecked(_First), _Unchecked(_Last),
_Dest, _Is_checked(_Dest)));
}
template<class _BidIt,
class _OutTy,
size_t _OutSize> inline
_OutTy *reverse_copy(_BidIt _First, _BidIt _Last,
_OutTy (&_Dest)[_OutSize])
{ // copy reversing elements in [_First, _Last), array dest
return (_Unchecked(
_STD reverse_copy(_First, _Last,
_Array_iterator<_OutTy, _OutSize>(_Dest))));
}
#endif /* _ITERATOR_DEBUG_LEVEL == 0 */
// TEMPLATE FUNCTION rotate_copy
template<class _FwdIt,
class _OutIt> inline
_OutIt rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last,
_OutIt _Dest)
{ // copy rotating [_First, _Last)
_Dest = _STD copy(_Mid, _Last, _Dest);
return (_STD copy(_First, _Mid, _Dest));
}
// TEMPLATE FUNCTION random_shuffle
template<class _RanIt,
class _Diff> inline
void _Random_shuffle(_RanIt _First, _RanIt _Last, _Diff *)
{ // shuffle [_First, _Last)
const int _RANDOM_BITS = 15; // minimum random bits from rand()
const int _RANDOM_MAX = (1U << _RANDOM_BITS) - 1;
_RanIt _Next = _First;
for (unsigned long _Index = 2; ++_Next != _Last; ++_Index)
{ // assume unsigned long big enough for _Diff count
unsigned long _Rm = _RANDOM_MAX;
unsigned long _Rn = _CSTD rand() & _RANDOM_MAX;
for (; _Rm < _Index && _Rm != ~0UL;
_Rm = _Rm << _RANDOM_BITS | _RANDOM_MAX)
_Rn = _Rn << _RANDOM_BITS
| (_CSTD rand() & _RANDOM_MAX); // build random value
_STD iter_swap(_Next, _First + _Diff(_Rn % _Index)); // swap a pair
}
}
template<class _RanIt> inline
void random_shuffle(_RanIt _First, _RanIt _Last)
{ // shuffle [_First, _Last)
_DEBUG_RANGE(_First, _Last);
if (_First != _Last)
_Random_shuffle(_Unchecked(_First), _Unchecked(_Last),
_Dist_type(_First));
}
// TEMPLATE FUNCTION random_shuffle WITH RANDOM FN
template<class _RanIt,
class _Fn1,
class _Diff> inlin
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -