📱关于算法

STL中算法的概述

算法-Algorithm

在STL中,除了用容器类模板自身提供的成员函数来操作容器元素外,还提供了一系列通用的对容器中元素进行操作的函数模板,称为算法

STL算法实现了对序列元素的一些常规操作,用函数模板实现的,主要包括:

  • 调序算法

  • 编辑算法

  • 查找算法

  • 算术算法

  • 集合算法

  • 堆算法

  • 元素遍历算法

除了算术算法在头文件numeric中定义外,其它算法都在头文件algorithm中定义。

大部分STL算法都是遍历指定容器中某范围内的元素,对满足条件的元素执行某项操作

算法的内部实现往往隐含着循环操作,但这对使用者是隐藏的。

  • 使用者只需要提供:容器(迭代器)、操作条件以及可能的自定义操作。

  • 算法的控制逻辑则由算法内部实现,这体现了一种抽象的编程模式。

算法与容器之间的关系

在STL中,不是把容器传给算法,而是把容器的某些迭代器传给它们,在算法中通过迭代器来访问和遍历相应容器中的元素。

这样做的好处是:使得算法不依赖于具体的容器,提高了算法的通用性

circle-info

虽然容器各不相同,但它们的迭代器往往具有相容关系,一个算法往往可以接受相容的多种迭代器。

算法接受的迭代器类型

一个算法能接收的迭代器的类型是通过算法模板参数的名字来体现的。例如:

  • src_firstsrc_last是输入迭代器,算法中只能读取它们指向的元素。

  • dst_first是输出迭代器,算法中可以修改它指向的元素。

  • 以上参数可以接受其它相容的迭代器。

算法的操作范围

用算法对容器中的元素进行操作时,大都需要用两个迭代器来指出要操作的元素的范围。

例如:

  • first是第一个元素的位置

  • last是最后一个元素的下一个位置

有些算法可以有多个操作范围,这时,除第一个范围外,其它范围可以不指定最后一个元素位置,它由第一个范围中元素的个数决定。例如:

一个操作范围的两个迭代器必须属于同一个容器,而不同操作范围的迭代器可以属于不同的容器。

算法的自定义操作条件

有些算法可以让使用者提供一个函数函数对象来作为自定义操作条件(或称为谓词),其参数类型为相应容器的元素类型,返回值类型为bool。

自定义操作条件可分为:

  • Pred:一元“谓词”,需要一个元素作为参数

  • BinPred:二元“谓词”,需要两个元素作为参数

一元谓词举例

例如,对于下面的“统计”算法:

可以有如下使用方式:

二元谓词举例

例如,对于下面的“排序”算法:

可以有如下用法:

算法的自定义操作

有些算法可以让使用者提供一个函数或函数对象作为自定义操作,其参数和返回值类型由相应的算法决定。

自定义操作可分为:

  • OpFun:一元操作,需要一个参数

  • BinOpBinFun:二元操作,需要两个参数

一元操作举例

例如,对于下面的“元素遍历”算法:

可以有如下用法:

二元操作举例

例如,对于下面的“累积”算法:

设元素为,e1,e2,...,ene_1, e_2, ..., e_n,算法返回tnt_n

t1=op(val,e1), t2=op(t1,e2), ...... tn=op(tn1,en1)t_1 = op(val, e_1), \ t_2 = op(t1, e_2), \ ...... \ t_n = op(t_{n-1}, e_{n-1})

可以有如下用法:

再例如,对于下面的元素“变换/映射”算法:

可以有如下用法:

circle-check

最后更新于