STL源码剖析 - 第6章 算法 - 6.7.1 数据处理算法 - 三

1、 replace//将区间[first,last)内的所有old_value都以new_value替代. template void replace(_ForwardIter __first, _ForwardIter __last, const _Tp& __old_value, const _Tp& __new_value) { __ST
摘要由CSDN通过智能技术生成

1、 replace

//将区间[first,last)内的所有old_value都以new_value替代.  
template <class _ForwardIter, class _Tp>  
void replace(_ForwardIter __first, _ForwardIter __last,  
             const _Tp& __old_value, const _Tp& __new_value) {  
  __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);  
  __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,  
         typename iterator_traits<_ForwardIter>::value_type, _Tp);  
  __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);  
  for ( ; __first != __last; ++__first)  
      //将区间内所有old_value都以new_value替代.  
    if (*__first == __old_value)  
      *__first = __new_value;  
}  


2、 replace_if

//将区间[first,last)内的所有被pred判断为true的元素都以new_value替代.  
template <class _ForwardIter, class _Predicate, class _Tp>  
void replace_if(_ForwardIter __first, _ForwardIter __last,  
                _Predicate __pred, const _Tp& __new_value) {  
  __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);  
  __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);  
  __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,  
             typename iterator_traits<_ForwardIter>::value_type);  
  for ( ; __first != __last; ++__first)  
    if (__pred(*__first))//pred判断为true  
      *__first = __new_value;//修改其值  
}  


3、 replace_copy

//将区间[first,last)内的所有old_value都以new_value替代.将新序列复制到result所指的容器中  
//原始容器的内容并不会改变  
template <class _InputIter, class _OutputIter, class _Tp>  
_OutputIter replace_copy(_InputIter __first, _InputIter __last,  
                         _OutputIter __result,  
                         const _Tp& __old_value, const _Tp& __new_value) {  
  __STL_REQUIRES(_InputIter, _InputIterator);  
  __STL_REQUIRES(_OutputIter, _OutputIterator);  
  __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,  
         typename iterator_traits<_InputIter>::value_type, _Tp);  
  for ( ; __first != __last; ++__first, ++__result)  
    *__result = *__first == __old_value ? __new_value : *__first;  
  return __result;  
}  


4、replace_copy_if  

//将区间[first,last)内的所有被pred判断为true的元素都以new_value替代.将新序列复制到result所指的容器中  
//原始容器的内容并不会改变  
template <class _InputIter, class _OutputIter, class _Predicate, class _Tp>  
_OutputIter replace_copy_if(_InputIter __first, _InputIter __last,  
                            _OutputIter __result,  
                            _Predicate __pred, const _Tp& __new_value) {  
  __STL_REQUIRES(_InputIter, _InputIterator);  
  __STL_REQUIRES(_OutputIter, _OutputIterator);  
  __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,  
                typename iterator_traits<_InputIter>::value_type);  
  for ( ; __first != __last; ++__first, ++__result)  
    *__result = __pred(*__first) ? __new_value : *__first;  
  return __result;  
}  


5、 reverse  

//将序列[first,last)的所有元素在原容器中颠倒重排  
//若迭代器类型为bidirectional_iterator_tag,则调用此函数  
template <class _BidirectionalIter>  
void __reverse(_BidirectionalIter __first, _BidirectionalIter __last,   
               bidirectional_iterator_tag) {  
  while (true)  
    if (__first == __last || __first == --__last)//这里需注意,每次判断last迭代器都会后退一位  
      return;  
    else  
      iter_swap(__first++, __last);//单向交换迭代器所指的元素  
}  
//若迭代器类型为random_access_iterator_tag,则调用此函数  
template <class _RandomAccessIter>  
void __reverse(_RandomAccessIter __first, _RandomAccessIter __last,  
               random_access_iterator_tag) {  
  while (__first < __last)//遍历容器  
    iter_swap(__first++, --__last);//交换两端迭代器所指的元素  
}  
//将序列[first,last)的所有元素在原容器中颠倒重排  
template <class _BidirectionalIter>  
inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last) {  
  __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);  
  //首先萃取出迭代器的类型  
  __reverse(__first, __last, __ITERATOR_CATEGORY(__first));  
}  


6、reverse_copy

//行为类似reverse,但产生的新序列会被置于以result指出的容器中  
template <class _BidirectionalIter, class _OutputIter>  
_OutputIter reverse_copy(_BidirectionalIter __first,  
                         _BidirectionalIter __last,  
                         _OutputIter __result) {  
  __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);  
  __STL_REQUIRES(_OutputIter, _OutputIterator);  
  while (__first != __last) {//遍历容器  
    --__last;//尾端前移一个位置  
    *__result = *__last;//result容器的起始位置元素值为原始容器尾端元素值  
    ++__result;//更新result,使其前进一个位置  
  }  
  return __result;  
}  


  

7、 rotate  

//将区间[first,middle)内的元素和[middle,last)内的元素互换。minddle所指的元素会成为容器的第一个元素  
//例如对序列{1,2,3,4,5,6,7},对元素3进行旋转操作,则结果为{3,4,5,6,7,1,2}  
 
//迭代器类型为forward_iterator_tag,调用此函数  
template <class _ForwardIter, class _Distance>  
_ForwardIter __rotate(_ForwardIter __first,  
                      _ForwardIter __middle,  
                      _ForwardIter __last,  
                      _Distance*,  
                      forward_iterator_tag) {  
  if (__first == __middle)  
    return __last;  
  if (__last  == __middle)  
    return __first;  
  
  _ForwardIter __first2 = __middle;  
  do {  
    swap(*__first++, *__first2++);  
    if (__first == __middle)  
      __middle = __first2;  
  } while (__first2 != __last);  
  
  _ForwardIter __new_middle = __first;  
  
  __first2 = __middle;  
  
  while (__first2 != __last) {  
    swap (*__first++, *__first2++);  
    if (__first == __middle)  
      __middle = __first2;  
    else if (__first2 == __last)  
      __first2 = __middle;  
  }  
  
  return __new_middle;  
}  
  
//迭代器类型为bidirectional_iterator_tag,调用此函数  
template <class _BidirectionalIter, class _Distance>  
_BidirectionalIter __rotate(_BidirectionalIter __first,  
                            _Bi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值