STL算法之 copy、copy_backward、copy_n

本文详细介绍了STL中用于复制元素的三个算法:copy、copy_backward和copy_n。讨论了它们的功能、源码实现以及不同迭代器类型的处理策略,包括对输入迭代器和随机存取迭代器的优化。通过对源码的解析,揭示了如何利用特化版本提高效率,如使用memmove等内建函数。
摘要由CSDN通过智能技术生成

这些函数都定义在stl_algobase.h里面,使用时只需要包含 algorithm 头文件就行。

copy :

STL 的SGI版本中的copy函数声明如下:

template <class InputIterator, class OutputIterator>
inline OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result) ;

该函数完成的功能:把[first, last)区间的元素拷贝到以result为起始地址的空间中。
以上是copy的泛化版本,除此之外,还有两个特化版本:

inline char* copy(const char* first, const char* last, char* result) ;
inline wchar_t* copy(const wchar_t* first, const wchar_t* last,  wchar_t* result) ;

这两个函数是针对char类型的指针,如果拷贝的是char类型的指针所指向的内存,则直接调用特化版本,这两个函数的内部其实就是调用memmove()函数,然后返回拷贝目的数据区间的下一个位置的地址。

下面先大概图解一下对于copy的具体调用过程。
这里写图片描述
下面是copy的源码,函数实现定义在stl_algobase.h中: 接下来用源码解释上面这幅函数调用图。
(ps : 在下面的源码中,我用具有指导作用的标题表示他们的调用关系;
例如:copy函数有三个版本,我用1.1表示它的第一个泛化版本,用1.2表示第二个特化版本,用1.3表示它的第三个特化版本,用1.1.1表示__copy_dispatch的第一个泛化版本,依次类推。)

1.1
copy的泛化版本:

template <class InputIterator, class OutputIterator>
inline OutputIterator copy(InputIterator first, InputIterator last,
                           OutputIterator result)
{
  return __copy_dispatch<InputIterator,OutputIterator>()(first, last, result);
}

在上面的函数调用中,其实是copy调用了一个仿函数,__copy_dispatch是一个结构体,该结构体重载了operator()运算符,__copy_dispatch<InputIterator,OutputIterator>()是一个__copy_dispatch类型的匿名对象,该对象能接受first, last, result作为函数参数。
__copy_dispatch 结构定义如下:

template <class InputIterator, class OutputIterator>
struct __copy_dispatch
{
  OutputIterator operator()(InputIterator first, InputIterator last,
                            OutputIterator result) {
    return __copy(first, last, result, iterator_category(first));
  }
};

1.2
copy的特化版本1:

inline char* copy(const char* first, const char* last, char* result) {
  memmove(result, first, last - first);
  return result + (last - first);
}

1.3
copy的特化版本2:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值