August 2021
Intermediate to advanced
450 pages
6h 57m
Chinese
大多数标准库算法都有两个版本:
·一个“普通”版本使用常规操作(如<和==)完成其任务
·另一个版本接受关键操作参数
例如:
这极大地提高了标准库的灵活性和应用范围。
一个算法的两个常用版本可以实现为两个(重载的)函数模板或是带默认实参的单一函数模板。例如:
如果使用函数指针,就能察觉两个函数和带默认实参的单一函数间的差异。不过,还是将标准库算法的很多版本简单看作“带默认谓词的版本”比较好,这能将你需要记忆的函数模板的数量减少差不多一半。
在某些情况下,实参既可以解释为谓词,也可以解释为值。例如:
一般而言,编译器无法消除这类代码的二义性,而且即使是编译器能消除二义性的情况,程序员也会感到困惑。
为了简化程序员的任务,标准库一般使用后缀_if指出算法接受一个谓词。使用两个名字来区分不同版本是为了减少二义性和困扰。考虑下面的例子:
某些作为实参传递给算法的操作会修改所施用的元素(例如,传递给for_each()的一些操作;见32.4.1节),但大多数操作还是谓词(例如传递给sort()的比较对象)。除非特别说明,我们假定传递给算法的策略实参不会修改元素。特别是,不要试图用谓词修改元素: ...
Read now
Unlock full access