目录
- 基本说明
- 算法如何工作
- 迭代器令算法不依赖于容器,…
- …,但算法依赖于元素类型的操作
基本说明
大多数算法都定义在头文件algorithm中
不直接操作容器,而是操作迭代器,所以具备普适性
举例:find算法
输入:迭代器范围以及查找值
返回值:找到则返回查找值的迭代器,否则返回end()
也可以操作string
操作数组
算法如何工作
- 访问序列中的首元素。
- 比较此元素与我们要查找的值。
- 如果此元素与我们要查找的值匹配,find返回标识此元素的值。4.
- 否则,find前进到下一个元素,重复执行步骤2和 3。
- 如果到达序列尾,find应停止。
- 如果 find到达序列末尾,它应该返回一个指出元素未找到的值。此值和步骤3返回的值必须具有相容的类型。
这些步骤都不依赖于容器所保存的元素类型。因此,只要有一个迭代器可用来访问元素,find就完全不依赖于容器类型(甚至无须理会保存元素的是不是容器)。
迭代器令算法不依赖于容器,…
在上述find函数流程中,除了第2步外,其他步骤都可以用迭代器操作来实现:利用迭代器解引用运算符可以实现元素访问;如果发现匹配元素,find可以返回指向该元素的迭代器;用迭代器递增运算符可以移动到下一个元素;尾后迭代器可以用来判断find是否到达给定序列的末尾;find可以返回尾后迭代器(参见9.2.1节,第296页)来表示未找到给定元素。
…,但算法依赖于元素类型的操作
虽然迭代器的使用令算法不依赖于容器类型,但大多数算法都使用了一个(或多个)元素类型上的操作。例如,在步骤2中,find用元素类型的==-运算符完成每个元素与给定值的比较。其他算法可能要求元素类型支持<运算符。不过,我们将会看到,大多数算法提供了一种方法,允许我们使用自定义的操作来代替默认的运算符。
关键概念:算法永远不会执行容器的操作
泛型算法本身不会执行容器的操作,它们只会运行于迭代器之上,执行迭代器的操作。泛型算法运行于迭代器之上而不会执行容器操作的特性带来了一个令人惊讶但非常必要的编程假定:算法永远不会改变底层容器的大小。算法可能改变容器中保存的元素如我们将在10.4.1节(第358页)所看到的,标准库定义了一类特殊的迭代器,称为插入器(inserter)。与普通迭代器只能遍历所绑定的容器相比,插入器能做更多的事情。当给这类迭代器赋值时,它们会在底层的容器上执行插入操作。因此,当一个算法操作一个这样的迭代器时,迭代器可以完成向容器添加元素的效果,但算法自身永远不会做这样的操作。