接下来, 我们主要介绍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的算法, 参考如下注释:
下面看看如何查看属性: