在看SGI STL源码的时候,毕竟会碰到很多的算法,不理解这些算法对我们的阅读产生了很大的影响,现在先来分析下几个已经碰到的了的算法。第一个Copy()算法。
Copy算法说起来很简单就是将迭代器里面的 [first,last]区间里的元素赋值到指定的 result 指定的区间里面去[result,result+(last-first)]。看下函数原型 并且解析下。
- template<class InputIterator, class OutputIterator>
- OutputIterator copy(
- InputIterator _First,
- InputIterator _Last,
- OutputIterator _DestBeg
- );
参数
-
_First, _Last
- 指出被复制的元素的区间范围[ _First,_Last). _DestBeg
-
指出复制到的目标区间起始位置
返回值
返回一个迭代器,指出已被复制元素区间的最后一个位置。。
接下来我将放上一个Copy()的使用案例,并且对代码里面的细节,以及Copy()算法在容器内部的运动情况做一个详解。
#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
int myints[] = { 1,2,3,4,5,6,7,8,9,10 };
std::vector<int> myvector;
std::vector<int>::iterator it;
myvector.resize(10); /*必须为Vector分配空间,如果不分配空间会爆炸的*/
//copy用法一:
//将数组myints中的十个元素复制到myvector容器中
copy(myints, myints + 10, myvector.begin());
std::cout << "myvector contains: ";
for (it = myvector.begin(); it != myvector.end(); ++it)
{
std::cout << " " << *it;
}
std::cout << std::endl;
return 0;
}
首先这个没啥说的,就是把这个数组Copy到了Vector里面去。 Copy代码到你的VS2013里面跑一下就知道了。接下来我们说下copy元素并且插入到指定位置的时候,Vector中指针的运作。先通过观察数据变化来总结规律
#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
int myints[] = { 1,2,3,4,5,6,7,8,9,10 };
std::vector<int> myvector;
std::vector<int>::iterator it;
myvector.resize(10); /*必须为Vector分配空间,如果不分配空间会爆炸的*/
//copy用法二:
//将数组myints中的元素向左移动一位
std::copy(myints + 1, myints +10, myints);
std::cout << "myints contains: ";
for (size_t i = 0; i < 10; ++i)
{
std::cout << " " << myints[i];
}
std::cout << std::endl;
return 0;
}
我们将移动的值改为2.
在来测试一个值,让myints+5。
明眼的朋友一定都找出规律了,但是还是得来画图说明下copy在Vector中的指针的运作模式。直接以第三个myints+5的运作为例说明,其他的都是相同原理,举一反三。
多早几次实验,总结数据就会得出这个规律。这就是STL 当中的copy()算法。