STL: non-modifying algorithms

接下来, 我们主要介绍STL中的算法。

STL中的算法主要可以分为两大类。 一种是Non-Modifying algorithm, 一种是modifying algorithm。

下面首先介绍Non-Modifying algorithm。 

许多人都喜欢使用STL中的容器, 例如vector。 但是他们很少使用算法。 因为他们根本不清楚有什么算法, 哪些算法可用。

然而事实是, 你应该使用STL算法, 而且you should use it a lot。

在介绍算法的时候, 我们将会多次调到lambda function。 所谓的lambda function is a function without a name。

例如下面的函数:

[] (int x) { return x < 10}

就是一个lambda 函数。 上述的lambda 函数和下面定一的普通函数lessThan10做的事情是一样的。




STL的Non-Modifying algorithm 主要有count, min, compare, linear search, attribute(检查属性)。

下面举例说明:

对于count  函数, 使用的是defalut operation, 即等于 =。

这样:             算法————数据——————————————————-——操作

于是, 等价于:



另外, 关于数据, 由于是vector的迭代器, 当然可以随即选择切片数据操作了, 如下:


总程序分析如下:

下面的max_element函数会返回指向最大值的迭代器(默认的是小于操作)。 由于从90 到最后, 两个90, 所以返回的是指向第一个90的迭代器。

max_element 也允许函数被重载。 如下,  我们使用一个lambda 函数, 重载了函数max_element。  最后一个函数minmax 返回的是一个pair  of Iterators, 一个是最小的元素的迭代器(这里看的是least significant digit), 一个是最大的元素的迭代器。


记下来, 对于当我们的数据没有被排序的时候, 使用Linear search 算法, 否则可以使用更快的binary search:

下图中,解释如下:

(1)函数find返回的迭代器指向是第一个等于55 的元素。

(2)find_if 返回的迭代器是指向第一个大于80的元素

(3)find_if_not 返回的迭代器是指向第一个不大于80 的元素

(4)search_n 返回的迭代器指向出现2个连续的69 的元素的第一个元素

(5)search返回的是the first subrange(vec 中) that matches this pattern

(6) find_end 返回的是the last subrange(vec中) that matches the pattern.






接下来:

首先我们定义一个vector的items 。 然后我们调用find_first_of 从vec 中找到第一个能够mach item 中的任何一个元素的项的迭代器。

第二个find_first_of  的一般形式, 找到是第一个满足条件的项。

adjacent_find 是从vec 中找到两个相邻的而且相等的项。 同理, 一般形式也不难理解。 



再看比较range的算法, 参考如下注释:



下面看看如何查看属性:





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值