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

什么事质变算法:

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

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

这就是完整的泛型算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于C++ STL源码分析,这是一个广泛而复杂的话题。C++ STL是C++标准库中的一部分,包含了许多不同的容器、算法和迭代器等组件,用于提供通用的数据结构和算法支持。 在进行源码分析之前,你需要具备一定的C++编程知识和理解C++模板的工作原理。然后,你可以通过查看STL源码实现来深入了解其内部机制。 在C++ 11中,STL引入了一些新的特性和容器。例如,引用中提到的range-based for循环语句,可以更方便地遍历容器中的元素。此外,C++ 11还对容器进行了分类,包括序列容器、关联容器和无序容器等。 引用提到了STL的六个主要部分,包括容器、算法、迭代器、函数对象、适配器和分配器。这些部分提供了不同的功能和特性,可以满足各种编程需求。 在C++ 11中,一些容器名称发生了变化,如slist被重命名为forward_list,hash_set和hash_map被重命名为unordered_set和unordered_map。这些变化是为了更好地反映容器的功能和语义。 要深入了解STL源码,你可以参考一些重要的资源网站,如cplusplus.com、cppreference.com和gcc.gnu.org。这些网站提供了详细的文档和例子,以帮助你理解STL的实现细节。 总之,要进行C++ STL源码分析,你需要具备一定的编程和模板知识,并参考相关的文档和资源。通过深入研究STL源码实现,你将能够更好地理解其内部机制和使用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值