STL算法之copy

STL算法之copy

copy

使用必须包含头文件<algorithm>

由于copy进行的是复制操作,而复制操作不外乎assignment operator和copy constructor(copy算法用的是前者),但是某些元素型别用于的是trivial assginment operator,因此,如果能够使用内存直接复制行为(例如C标准函数memmove或memcpy),变能够节省大量时间。为此,SGI STL的copy算法用尽各种办法,包括函数重载、性别特性、偏特化等编程技巧,无所不用其极地加强效率。如下图所示:


         copy算法是一一进行元素的复制操作,如果输出区间的起点位于输入区间内,copy算法便(可能)会在输入区间的(某些)元素尚未被复制之前,就覆盖其值,导致错误结果。我们使用”可能”这个字眼,是因为如果copy算法根据其所接收的迭代器的特性决定调用memmove()来执行任务,就不会造成上述错误,因为memmove()会先将整个输入区间的内容复制下来,没有被覆盖的危险。

         以下是copy的实现代码:

// copy 函数运用function overloading, type traits,partial
// specialization, 无所不用其极的改善效率
//copy有一个全特化和两个偏特化版本
template<class InputIterator, class OutputIterator>
inlineOutputIterator copy(InputIterator first, InputIterator last,
                           OutputIteratorresult)
{
  return__copy_dispatch<InputIterator,OutputIterator>()(first, last, result);
}
 
inline char* copy(const char* first, const char* last, char*result) {
 memmove(result, first, last - first);
  return result + (last - first);
}
 
inline wchar_t* copy(const wchar_t* first, constwchar_t* last,
                     wchar_t*result) {
 memmove(result, first, sizeof(wchar_t) * (last - first));
  return result + (last - first);
}
 
 
//__copy_dispatch有一个完全泛华版本和两个偏特化版本
template<class InputIterator, class OutputIterator>
struct__copy_dispatch
{
 OutputIterator operator()(InputIteratorfirst, InputIterator last,
                            OutputIterator result) {
   return __copy(first, last, result,iterator_category(first));
 }
};
template<class T>
struct__copy_dispatch<T*, T*>
{
 T* operator()(T* first, T* last, T*result) {
   typedef typename__type_traits<T>::has_trivial_assignment_operator t;
   return __copy_t(first, last, result,t());
 }
};
template<class T>
struct__copy_dispatch<const T*, T*>
{
 T* operator()(constT* first, const T* last, T* result) {
   typedef typename__type_traits<T>::has_trivial_assignment_operator t;
   return __copy_t(first, last, result,t());
 }
};
 
//__copy有两个版本,一个用于对输入参数类型为InputIterator迭代器设计,
//另一个对输入参数类型为RandomAccessIterator迭代器设计
template<class InputIterator, class OutputIterator>
inlineOutputIterator __copy(InputIterator first, InputIterator last,
                             OutputIteratorresult, input_iterator_tag)
{
  for ( ; first != last; ++result, ++first)
   *result = *first;
  return result;
}
template<class RandomAccessIterator, class OutputIterator>
inlineOutputIterator
__copy(RandomAccessIterator first,RandomAccessIterator last,
      OutputIterator result, random_access_iterator_tag)
{
  return __copy_d(first, last, result,distance_type(first));
}
 
//__copy_d()是对输入参数为RandomAccessIterator的实现
template<class T>
struct__copy_dispatch<const T*, T*>
{
 T* operator()(constT* first, const T* last, T* result) {
   typedef typename__type_traits<T>::has_trivial_assignment_operator t;
   return __copy_t(first, last, result,t());
 }
};
 
 
//__copy_t()有两个版本,分别对应指针所指向对象具备trival assignmentoperator
//和non-trival assignment operator
template<class T>
inlineT* __copy_t(const T* first, const T* last, T* result, __true_type) {
 memmove(result, first, sizeof(T) * (last- first));
  return result + (last - first);
}
 
template<class T>
inlineT* __copy_t(const T* first, const T* last, T* result, __false_type) {
  return __copy_d(first, last, result, (ptrdiff_t*) 0);
}


copy_backward()以逆行方向复制,实现技巧与copy相似。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值