首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数
指针。如果在函数内对容器元素做了修改,那么就属于变动性算法。
变动性算法源代码分析与使用示例:
一、copy、copy_backward
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
// TEMPLATE FUNCTION copy template< class _InIt, class _OutIt, class _InOutItCat> inline _OutIt __CLRCALL_OR_CDECL _Copy_opt(_InIt _First, _InIt _Last, _OutIt _Dest, _InOutItCat, _Nonscalar_ptr_iterator_tag, _Range_checked_iterator_tag) { // copy [_First, _Last) to [_Dest, ...), arbitrary iterators _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_Dest, ++_First) *_Dest = *_First; return (_Dest); } template< class _InIt, class _OutIt> inline _IF_CHK(_OutIt) __CLRCALL_OR_CDECL copy(_InIt _First, _InIt _Last, _OutIt _Dest) { // copy [_First, _Last) to [_Dest, ...) return (_Copy_opt(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, _Iter_random(_First, _Dest), _Ptr_cat(_First, _Dest), _Range_checked_iterator_tag())); } // TEMPLATE FUNCTION copy_backward template< class _BidIt1, class _BidIt2, class _InOutItCat> inline _BidIt2 __CLRCALL_OR_CDECL _Copy_backward_opt(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest, _InOutItCat, _Nonscalar_ptr_iterator_tag, _Range_checked_iterator_tag) { // copy [_First, _Last) backwards to [..., _Dest), arbitrary iterators _DEBUG_RANGE(_First, _Last); while (_First != _Last) *--_Dest = *--_Last; return (_Dest); } template < class _BidIt1, class _BidIt2 > inline _IF_CHK(_BidIt2) __CLRCALL_OR_CDECL copy_backward(_BidIt1 _First, _BidIt1 _Last, _BidIt2 _Dest) { // copy [_First, _Last) backwards to [..., _Dest) return _Copy_backward_opt(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, _Iter_random(_First, _Dest), _Ptr_cat(_First, _Dest), _STD _Range_checked_iterator_tag()); } |
copy 调用了_Copy_opt,在此函数内递增迭代器,从前两个参数指定的区间内取出元素并拷贝到对应_Dest位置上。
for (; _First != _Last; ++_Dest, ++_First)
*_Dest = *_First;
copy_backward 调用了_Copy_backward_opt,与copy 不同的是实现反向拷贝,即从尾端开始拷贝,所以是递减迭代器。
while (_First != _Last)
*--_Dest = *--_Last;
示例代码1:
C++ Code