实际上我们的容器对于算法是不可见的,也就是说算法看不见容器这个东西,也不知道容器中到底装的什么什么类型的东西,不知道该怎么遍历这个容器,更不知道以哪种方式来对容器中的元素进行比较等操作。
1.算法不需要直接对容器进行操作。我们都是通过迭代器来访问的,至于到底是挨个访问呢还是可以跳动的访问呢,那就取决于迭代器的类型,这就是观点一:迭代器类型也决定了算法的不同的设计。
2.至于算法通过不同的迭代器做什么操作,比较大小?逻辑运算?一般我们可以通过仿函数告诉算法。不仅()运算符重载可以作为比较的规则,有时我们也可以直接将一个全局函数的地址传给算法,
在这里举个简单的一个算法的例子:
distance():求出俩个迭代器之间的距离(即节点的个数)
这是暴漏给用户的接口:
template
inline
iterator_trais ::different_type distance( inputiterator first,inputiterator last)
//红色部分:用萃取机将迭代器间距离的类型转换出来,作为函数的返回值的类型
{
iterator_trais ::iterator_category category;
//算法一进来也是用萃取机将迭代器的类型萃取出来,然后通过参数类型的匹配,决定调用哪个函数
return _distance (first , last , category());
}
STL库针对上面的distance() 根据迭代器类型的不同算法版本:
版本1:针对随机迭代器
_distance(randomaccessiterator first,
randomaccessiterator last,
random_access_iterator_tag)
{
return last - first;
}
版本2:针对普通迭代器(只能一步一步走,不能跳)
_distance(inputiterator first,
inputiterator last,
input_iterator_tag)
{
iterator_traist::difference_type n =0;
//萃取出迭代器间距离的类型并定义b变量记录着first到last的步数
while(first!=last)
{
++first;
++n;
}
return n;
}
再来理解一下copy()中迭代器类型对于算法的影响:
函数原型:
copy(inputiterator first,
inputiterator last,
outpuriterator result) //将first到last之间的数据拷贝到result开头的内存中去
以下是copy函数的实现的流程: