STL源码之copy算法深入学习

copy算法可将输入区间[first, last)内的元素复制到输出区间[result, result+(last-first))内。也就是说,它会执行赋值操作*result = *first, *(result+1) = *(first+1), …依次类推。返回一个迭代器:result+(last-first))

SGI STL的copy算法,内部实现机制:

stl源码图6-2

  1. copy算法,需要特别注意区间重叠的情况:
    stl源码图6-3
    (1)copy算法(可能)会在输入区间的(某些)元素尚未被复制之前,就覆盖其值,导致错误。
    (2)如果copy算法根据其所接收的迭代器的特性决定调用memmove()来执行任务,就不会造成上述错误,因为memmove()会先将整个输入区间的内容复制下来,没有被覆盖的危险。下面看一个实例:

    注意:如果以vector取代上述的deque进行测试,复制结果将是正确的,因为vector迭代器其实是个原生指针(native pointer),导致调用的copy算法以memmove执行实际复制操作。

    (3)copy更改的是[result, result+(last-first))中的迭代器所指对象,而非迭代器本身。它会为输出区间的元素赋予新值,而不是产生新的元素。它不能改变输出区间的迭代器个数。换句话说,copy不能直接用来将元素插入空容器中。

  2. copy算法部分实现细节
    (1)完全泛化版本

    (2)下面两个是多载函数,针对原生指针(可视为一种特殊的迭代器)const char*和const wchar_t*,进行内存直接拷贝操作

    (3)copy函数的泛化版本中调用了一个__copy_dispatch()函数,此函数有一个完全泛化版本和两个偏特化版本:

    (4)__copy_dispatch的完全泛化版根据迭代器种类的不同,调用了不同的__copy(),为的是不同种类的迭代器所使用的循环条件不同,有快慢之分。

    (5)SGI STL采用所谓的__type_traits<>编程技巧来侦测某个对象的类型是否具有trivial assignment opeator:

    参考:STL源码剖析

发表评论

电子邮件地址不会被公开。 必填项已用*标注