SGISTL源码阅读 算法 前言

SGISTL源码阅读 算法 前言

STL有六大组件,我们已经分析了空间配置器、迭代器和容器,现在将进入对算法的学习。
STL中实现了很多极具复用价值的算法,排序(sorting),查找(searching),排列组合(permutation),用于数据移动、复制、删除、比较、组合、运算等的算法。所有STL算法都作用在由迭代器[first,last)所标示出来的范围内,在进入正式分析算法之前,我们先对其整体做一个了解。
所有的数值(numeric)算法都实现于SGI<stl_numeric.h>中,用户必须包含上层的<numeric>才能调用里面的算法,因为<stl_numeric.h>是一个内部文件。其他STL算法都实现于<stl_algo.h><stl_algobase.h>文件中,它们也都是内部文件,需要使用必须包含上层相关头文件<algorithm>
许多STL算法不只支持一个版本,这一类算法的某个版本采用缺省运算行为,另一个版本提供额外参数,接受外界传入的一个仿函数,之后将要介绍的很多算法都有两个版本。

算法分类

我们可以将STL中的算法分为以下两类。

质变算法(mulating algorithms)

质变算法是指运算过程中会改变迭代器所指区间的元素内容,也就是会改变操作对象的值,例如插入,删除,替换等。
质变算法也分为了两种

  • in-place(就地进行版)
    就地改变其操作对象
  • copy(另地进行版)
    将操作对象的内容复制一份副本,饭后在副本上进行修改并返回副本。(copy版总是以_copy作为函数名称尾词)
非质变算法(nomulating algorithms

质变算法是指运算过程中不会改变迭代器所指区间的元素内容。例如查找,遍历,比较等。

算法的泛化过程

之前学习过很多不同的容器,他们都拥有不同的数据结构,却需要进行一些类似的操作,如果针对每一个容器都制定一个不同的算法,那将会出现很多重复的代码块。之前提到过,迭代器是算法和数据结构之间的粘合剂,我们通过将操作对象的型别加以抽象化,把操作对象的标示法和区间目标移动行为抽象化,整个算法就在一个抽象的层面上工作, 而不用考虑其数据结构,这样的过程就是泛型化。

每一个STL算法的声明,都表现出它所需要的最低程度的迭代器类型,也可以接受更高类型(继承最低程度的迭代器类型)的迭代器。(迭代器有5种,他们之间的继承关系我们之前提到过,如下图)。如果某个算法不支持这种迭代器,而却传入了,这显然是一种错误。但是我们知道迭代器的类型是一种型别参数,并不能保证能够在编译时期就被发现。

在这里插入图片描述

总结

接下来让我们分析STL中的算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值