STL源码分析之泛型算法由来

本文介绍了质变算法与非质变算法的区别,并详细解释了算法泛化的过程,包括如何通过迭代器实现通用算法,使得同一算法适用于多种数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么事质变算法:

是指在运算过程中会更改区间内(迭代器所指)的元素内容

         例如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;
}

这就是完整的泛型算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值