什么事质变算法:
是指在运算过程中会更改区间内(迭代器所指)的元素内容
例如copy, swap,replace, fill, remove, sort等等
什么是非质变算法:
例如find,search, count, max, min等等
算法的泛化过程
关于数组,当我们在其内寻找某个元素时,找到即返回;如果没有找到,就返回最后一个元素的下一个位置
这里“最后一个元素的下一个位置”,称为end。虽然在之前的学习过程中被教导千万不要数组越界,但事实上一个指向array元素的指针不但可以指向array内任意一个位置,也可以指向array外的任何位置。
只是当指针指向array外的位置时,它只能用来与其他array指针相比较,不能取其值
所以如下是成立的:
Int *find(int *a, int size, int value)
{
for(int i=0;i<size; i++)
if(a[i] == value)
break;
return&a[i]; //即使走到最后没找到也是直接返回
}
//使用过程中
//…
Int *end = a+arraysize; //令end指向最后元素的下一个位置
Int *ip = find(a, sizeof(a)/sizeof(int),value);
If(ip == end)
Cout<<”not found”<<endl;
//…
然而我们发现这样调用函数暴露了太多细节,因此修改为这样:
Int *find(int *begin, int *end, int value)
{
While(begin!=end&& *begin!=value)
++begin;
return begin;
}
//如此一来,我们不仅隐藏了细节,还能在数组任意部分实现查找
//使用也还是与之前并无太大区别
由于find函数内并无任何操作是针对特定的整数array而发的,所以使用模板:
Template<typename T>
//这里之所以将value的类型变为constT&
//是因为可能传入的类型过大,这样可以避免成本
T* find(T* begin, T* end, const T&value)
{
//既然使用了模板,我们就要注意以下用到了 operate!= , operate*, operate++
While(begin!=end&& *begin!=value)
++begin;
//以下操作也会引发copy行为
return begin;
}
这样一来,几乎适合所有容器了,只要该容器允许指针,且支持operate!= , operate*, operate++和copy行为
于是就产生了迭代器的概念,使用迭代器代替这里的指针,因为c++的博大,使得这些限制都有了不错的解决方案
Template<class Iterator, typename T>
Iterator find(Iterator begin, Iterator end,const T& value)
{
While(begin!=end&& *begin!=value)
++begin;
return begin;
}
这就是完整的泛型算法。