第10章 泛型算法

10 泛型算法

c++标准库容器本身的函数很少, 相反c++提供了一组算法, 这些算法可以(通过操作迭代器来)处理容器(比如查找元素, 排序, 等).
这些算法可以用于不同的容器和不同类型的元素, 所以它们是"通用的(generic)"或称"泛型的".
这些算法被称为"泛型算法".

10.1 概述

大多数算法定义在头文件algorithm中, 使用它们之前要#include .
另外头文件numeric中还定义了一组数值泛型算法.

算法并不直接操作容器, 而是遍历(由两个迭代器指定的)元素范围. 比如:

#include <algorithm>
auto result = std::find(vec.cbegin(), vec.cend(), val);

由于算法操作迭代器, 而不操作容器, 所以算法不依赖于容器.
由于算法要操作容器中的元素, 所以算法依赖于元素类型允许的操作.

算法永远不会执行容器的操作, 它只会运行于迭代器之上.
带来一个编程假定: 算法不会改变底层容器的大小.

10.2 初识泛型算法

标准库提供了超过100种算法, 这些算法有一致的结构.

大部分算法都对一个范围内的元素进行操作, 这个范围称为"输入范围".
这类算法总是使用前两个参数来表示此范围.

10.2.1 只读算法

只读取输入范围内的元素, 而不改变元素. 比如find, count, accumulate(定义在头文件numeric中).

只读算法的前两个参数最好使用cbegin()和cend().

accumulate执行累加操作, 第三个参数是初始值, 它的类型决定了使用哪个加法运算符以及返回值的类型.
比如要对string类型的元素累加, 则第三个参数类型必须是string, 不能是字符串直接量.

equal算法用于确定两个序列是否保存相同的值, 特殊之处在于它操作两个序列.
equal(roster1.cbegin(), roster1.cend(), roster2.cbegin());
第三个参数是第二个序列的首元素.
注意: equal比较的元素不必完全一样, 比如roster1是 vector, roster1可以是list<const char*>.
注意: equal假定第二个序列至少与第一个序列一样长.
注意: 如果第二个序列比较短, 返回false

[待续]

posted @ 2022-07-10 15:19  编程驴子  阅读(21)  评论(0编辑  收藏  举报