📄 algorithm
字号:
_FwdIt2 _First2, _FwdIt2 _Last2)
{ // find last [_First2, _Last2) match
typedef iterator_traits<_FwdIt1>::difference_type _Diff1;
typedef iterator_traits<_FwdIt2>::difference_type _Diff2;
_Diff1 _Count1 = 0;
_Iter_distance(_First1, _Last1, _Count1);
_Diff2 _Count2 = 0;
_Iter_distance(_First2, _Last2, _Count2);
_FwdIt1 _Ans = _Last1;
if (0 < _Count2)
for (; _Count2 <= _Count1; ++_First1, --_Count1)
{ // room for match, try it
_FwdIt1 _Mid1 = _First1;
for (_FwdIt2 _Mid2 = _First2; ; ++_Mid1)
if (!(*_Mid1 == *_Mid2))
break;
else if (++_Mid2 == _Last2)
{ // potential answer, save it
_Ans = _First1;
break;
}
}
return (_Ans);
}
template<class _FwdIt1,
class _FwdIt2> inline
_FwdIt1 find_end(_FwdIt1 _First1, _FwdIt1 _Last1,
_FwdIt2 _First2, _FwdIt2 _Last2)
{ // find last [_First2, _Last2) match
_STLCLRDB_RANGE(_First1, _Last1);
_STLCLRDB_RANGE(_First2, _Last2);
return (cliext::find_end_unchecked(
_Unchecked(_First1), _Unchecked(_Last1),
_Unchecked(_First2), _Unchecked(_Last2)));
}
// TEMPLATE FUNCTION find_end WITH PRED
template<class _FwdIt1,
class _FwdIt2,
class _Pr> inline
_FwdIt1 find_end_unchecked(_FwdIt1 _First1, _FwdIt1 _Last1,
_FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred)
{ // find last [_First2, _Last2) satisfying _Pred
typedef iterator_traits<_FwdIt1>::difference_type _Diff1;
typedef iterator_traits<_FwdIt2>::difference_type _Diff2;
_Diff1 _Count1 = 0;
_Iter_distance(_First1, _Last1, _Count1);
_Diff2 _Count2 = 0;
_Iter_distance(_First2, _Last2, _Count2);
_FwdIt1 _Ans = _Last1;
if (0 < _Count2)
for (; _Count2 <= _Count1; ++_First1, --_Count1)
{ // room for match, try it
_FwdIt1 _Mid1 = _First1;
for (_FwdIt2 _Mid2 = _First2; ; ++_Mid1)
if (!_Pred(*_Mid1, *_Mid2))
break;
else if (++_Mid2 == _Last2)
{ // potential answer, save it
_Ans = _First1;
break;
}
}
return (_Ans);
}
template<class _FwdIt1,
class _FwdIt2,
class _Pr> inline
_FwdIt1 find_end(_FwdIt1 _First1, _FwdIt1 _Last1,
_FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred)
{ // find last [_First2, _Last2) satisfying _Pred
_STLCLRDB_RANGE(_First1, _Last1);
_STLCLRDB_RANGE(_First2, _Last2);
_STLCLRDB_POINTER(_Pred);
return (cliext::find_end_unchecked(
_Unchecked(_First1), _Unchecked(_Last1),
_Unchecked(_First2), _Unchecked(_Last2), _Pred));
}
// TEMPLATE FUNCTION find_first_of
template<class _FwdIt1,
class _FwdIt2> inline
_FwdIt1 find_first_of_unchecked(_FwdIt1 _First1, _FwdIt1 _Last1,
_FwdIt2 _First2, _FwdIt2 _Last2)
{ // look for one of [_First2, _Last2) that matches element
for (; _First1 != _Last1; ++_First1)
for (_FwdIt2 _Mid2 = _First2; _Mid2 != _Last2; ++_Mid2)
if (*_First1 == *_Mid2)
return (_First1);
return (_First1);
}
template<class _FwdIt1,
class _FwdIt2> inline
_FwdIt1 find_first_of(_FwdIt1 _First1, _FwdIt1 _Last1,
_FwdIt2 _First2, _FwdIt2 _Last2)
{ // look for one of [_First2, _Last2) that matches element
_STLCLRDB_RANGE(_First1, _Last1);
_STLCLRDB_RANGE(_First2, _Last2);
return (cliext::find_first_of_unchecked(
_Unchecked(_First1), _Unchecked(_Last1),
_Unchecked(_First2), _Unchecked(_Last2)));
}
// TEMPLATE FUNCTION find_first_of WITH PRED
template<class _FwdIt1,
class _FwdIt2,
class _Pr> inline
_FwdIt1 find_first_of_unchecked(_FwdIt1 _First1, _FwdIt1 _Last1,
_FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred)
{ // look for one of [_First2, _Last2) satisfying _Pred with element
for (; _First1 != _Last1; ++_First1)
for (_FwdIt2 _Mid2 = _First2; _Mid2 != _Last2; ++_Mid2)
if (_Pred(*_First1, *_Mid2))
return (_First1);
return (_First1);
}
template<class _FwdIt1,
class _FwdIt2,
class _Pr> inline
_FwdIt1 find_first_of(_FwdIt1 _First1, _FwdIt1 _Last1,
_FwdIt2 _First2, _FwdIt2 _Last2, _Pr _Pred)
{ // look for one of [_First2, _Last2) satisfying _Pred with element
_STLCLRDB_RANGE(_First1, _Last1);
_STLCLRDB_RANGE(_First2, _Last2);
_STLCLRDB_POINTER(_Pred);
return (cliext::find_first_of_unchecked(
_Unchecked(_First1), _Unchecked(_Last1),
_Unchecked(_First2), _Unchecked(_Last2), _Pred));
}
// TEMPLATE FUNCTION iter_swap
template<class _FwdIt1,
class _FwdIt2> inline
void iter_swap(_FwdIt1 _Left, _FwdIt2 _Right)
{ // swap *_Left and *_Right
cliext::swap(*_Left, *_Right);
}
// TEMPLATE FUNCTION swap_ranges
template<class _FwdIt1,
class _FwdIt2> inline
_FwdIt2 swap_ranges_unchecked(_FwdIt1 _First1, _FwdIt1 _Last1,
_FwdIt2 _First2)
{ // swap [_First1, _Last1) with [_First2, ...)
for (; _First1 != _Last1; ++_First1, ++_First2)
cliext::iter_swap(_First1, _First2);
return (_First2);
}
template<class _FwdIt1,
class _FwdIt2> inline
_FwdIt2 swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1,
_FwdIt2 _First2)
{ // swap [_First1, _Last1) with [_First2, ...)
_STLCLRDB_RANGE(_First1, _Last1);
return (cliext::swap_ranges_unchecked(
_Unchecked(_First1), _Unchecked(_Last1),
_Unchecked(_First2)));
}
// TEMPLATE FUNCTION transform WITH UNARY OP
template<class _InIt,
class _OutIt,
class _Fn1> inline
_OutIt transform_unchecked(_InIt _First, _InIt _Last,
_OutIt _Dest, _Fn1 _Func)
{ // transform [_First, _Last) with _Func
for (; _First != _Last; ++_First, ++_Dest)
*_Dest = _Func(*_First);
return (_Dest);
}
template<class _InIt,
class _OutIt,
class _Fn1> inline
_OutIt transform(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn1 _Func)
{ // transform [_First, _Last) with _Func
_STLCLRDB_RANGE(_First, _Last);
_STLCLRDB_POINTER(_Dest);
_STLCLRDB_POINTER(_Func);
return (cliext::transform_unchecked(
_Unchecked(_First), _Unchecked(_Last),
_Dest, _Func));
}
// TEMPLATE FUNCTION transform WITH BINARY OP
template<class _InIt1,
class _InIt2,
class _OutIt,
class _Fn2> inline
_OutIt transform_unchecked(_InIt1 _First1, _InIt1 _Last1,
_InIt2 _First2, _OutIt _Dest, _Fn2 _Func)
{ // transform [_First1, _Last1) and [_First2, _Last2) with _Func
for (; _First1 != _Last1; ++_First1, ++_First2, ++_Dest)
*_Dest = _Func(*_First1, *_First2);
return (_Dest);
}
template<class _InIt1,
class _InIt2,
class _OutIt,
class _Fn2> inline
_OutIt transform(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2,
_OutIt _Dest, _Fn2 _Func)
{ // transform [_First1, _Last1) and [_First2, _Last2) with _Func
_STLCLRDB_RANGE(_First1, _Last1);
_STLCLRDB_POINTER(_First2);
_STLCLRDB_POINTER(_Dest);
_STLCLRDB_POINTER(_Func);
return (cliext::transform_unchecked(
_Unchecked(_First1), _Unchecked(_Last1),
_Unchecked(_First2), _Dest, _Func));
}
// TEMPLATE FUNCTION replace
template<class _FwdIt,
class _Ty> inline
void replace_unchecked(_FwdIt _First, _FwdIt _Last,
const _Ty% _Oldval, const _Ty% _Newval)
{ // replace each matching _Oldval with _Newval
for (; _First != _Last; ++_First)
if (*_First == _Oldval)
*_First = _Newval;
}
template<class _FwdIt,
class _Ty> inline
void replace(_FwdIt _First, _FwdIt _Last,
const _Ty% _Oldval, const _Ty% _Newval)
{ // replace each matching _Oldval with _Newval
_STLCLRDB_RANGE(_First, _Last);
cliext::replace_unchecked(_Unchecked(_First), _Unchecked(_Last),
_Oldval, _Newval);
}
// TEMPLATE FUNCTION replace_if
template<class _FwdIt,
class _Pr,
class _Ty> inline
void replace_if_unchecked(_FwdIt _First, _FwdIt _Last,
_Pr _Pred, const _Ty% _Val)
{ // replace each satisfying _Pred with _Val
for (; _First != _Last; ++_First)
if (_Pred(*_First))
*_First = _Val;
}
template<class _FwdIt,
class _Pr,
class _Ty> inline
void replace_if(_FwdIt _First, _FwdIt _Last,
_Pr _Pred, const _Ty% _Val)
{ // replace each satisfying _Pred with _Val
_STLCLRDB_RANGE(_First, _Last);
_STLCLRDB_POINTER(_Pred);
cliext::replace_if_unchecked(_Unchecked(_First), _Unchecked(_Last),
_Pred, _Val);
}
// TEMPLATE FUNCTION replace_copy
template<class _InIt,
class _OutIt,
class _Ty> inline
_OutIt replace_copy_unchecked(_InIt _First, _InIt _Last,
_OutIt _Dest, const _Ty% _Oldval, const _Ty% _Newval)
{ // copy replacing each matching _Oldval with _Newval
for (; _First != _Last; ++_First, ++_Dest)
*_Dest = *_First == _Oldval ? _Newval : *_First;
return (_Dest);
}
template<class _InIt,
class _OutIt,
class _Ty> inline
_OutIt replace_copy(_InIt _First, _InIt _Last,
_OutIt _Dest, const _Ty% _Oldval, const _Ty% _Newval)
{ // copy replacing each matching _Oldval with _Newval
_STLCLRDB_RANGE(_First, _Last);
_STLCLRDB_POINTER(_Dest);
return (cliext::replace_copy_unchecked(
_Unchecked(_First), _Unchecked(_Last),
_Unchecked(_Dest), _Oldval, _Newval));
}
// TEMPLATE FUNCTION replace_copy_if
template<class _InIt,
class _OutIt,
class _Pr,
class _Ty> inline
_OutIt replace_copy_if_unchecked(_InIt _First, _InIt _Last,
_OutIt _Dest, _Pr _Pred, const _Ty% _Val)
{ // copy replacing each satisfying _Pred with _Val
for (; _First != _Last; ++_First, ++_Dest)
*_Dest = _Pred(*_First) ? _Val : *_First;
return (_Dest);
}
template<class _InIt,
class _OutIt,
class _Pr,
class _Ty> inline
_OutIt replace_copy_if(_InIt _First, _InIt _Last,
_OutIt _Dest, _Pr _Pred, const _Ty% _Val)
{ // copy replacing each satisfying _Pred with _Val
_STLCLRDB_RANGE(_First, _Last);
_STLCLRDB_POINTER(_Dest);
_STLCLRDB_POINTER(_Pred);
return (cliext::replace_copy_if_unchecked(
_Unchecked(_First), _Unchecked(_Last),
_Unchecked(_Dest), _Pred, _Val));
}
// TEMPLATE FUNCTION generate
template<class _FwdIt,
class _Fn0> inline
void generate_unchecked(_FwdIt _First, _FwdIt _Last, _Fn0 _Func)
{ // replace [_First, _Last) with _Func()
for (; _First != _Last; ++_First)
*_First = _Func();
}
template<class _FwdIt,
class _Fn0> inline
void generate(_FwdIt _First, _FwdIt _Last, _Fn0 _Func)
{ // replace [_First, _Last) with _Func()
_STLCLRDB_RANGE(_First, _Last);
_STLCLRDB_POINTER(_Func);
cliext::generate_unchecked(_Unchecked(_First), _Unchecked(_Last), _Func);
}
// TEMPLATE FUNCTION generate_n
template<class _OutIt,
class _Diff,
class _Fn0> inline
void generate_n_unchecked(_OutIt _Dest, _Diff _Count, _Fn0 _Func)
{ // replace [_Dest, _Dest + _Count) with _Func()
for (; 0 < _Count; --_Count, ++_Dest)
*_Dest = _Func();
}
template<class _OutIt,
class _Diff,
class _Fn0> inline
void generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func)
{ // replace [_Dest, _Dest + _Count) with _Func()
_STLCLRDB_POINTER(_Dest);
_STLCLRDB_POINTER(_Func);
cliext::generate_n_unchecked(_Unchecked(_Dest), _Count, _Func);
}
// TEMPLATE FUNCTION remove_copy
template<class _InIt,
class _OutIt,
class _Ty> inline
_OutIt remove_copy_unchecked(_InIt _First, _InIt _Last,
_OutIt _Dest, const _Ty% _Val)
{ // copy omitting each matching _Val
for (; _First != _Last; ++_First)
if (!(*_First == _Val))
*_Dest++ = *_First;
return (_Dest);
}
template<class _InIt,
class _OutIt,
class _Ty> inline
_OutIt remove_copy(_InIt _First, _InIt _Last,
_OutIt _Dest, const _Ty% _Val)
{ // copy omitting each matching _Val
_STLCLRDB_RANGE(_First, _Last);
_STLCLRDB_POINTER(_Dest);
return (cliext::remove_copy_unchecked(
_Unchecked(_First), _Unchecked(_Last),
_Unchecked(_Dest), _Val));
}
// TEMPLATE FUNCTION remove_copy_if
template<class _InIt,
class _OutIt,
class _Pr> inline
_OutIt remove_copy_if_unchecked(_InIt _First, _InIt _Last,
_OutIt _Dest, _Pr _Pred)
{ // copy omitting each element satisfying _Pred
for (; _First != _Last; ++_First)
if (!_Pred(*_First))
*_Dest++ = *_First;
return (_Dest);
}
template<class _InIt,
class _OutIt,
class _Pr> inline
_OutIt remove_copy_if(_InIt _First, _InIt _Last,
_OutIt _Dest, _Pr _Pred)
{ // copy omitting each element satisfying _Pred
_STLCLRDB_RANGE(_First, _Last);
_STLCLRDB_POINTER(_Dest);
_STLCLRDB_POINTER(_Pred);
return (cliext::remove_copy_if_unchecked(
_Unchecked(_First), _Unchecked(_Last),
_Unchecked(_Dest), _Pred));
}
// TEMPLATE FUNCTION remove
template<class _FwdIt,
class _Ty> inline
_FwdIt remove_unchecked(_FwdIt _First, _FwdIt _Last,
const _Ty% _Val)
{ // remove each matching _Val
_First = cliext::find_unchecked(_First, _Last, _Val);
if (_First == _Last)
return (_First); // empty sequence, all done
else
{ // nonempty sequence, worth doing
_FwdIt _First1 = _First;
return (cliext::remove_copy(++_First1, _Last, _First, _Val));
}
}
template<class _FwdIt,
class _Ty> inline
_FwdIt remove(_FwdIt _First, _FwdIt _Last, const _Ty% _Val)
{ // remove each matching _Val
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -