- (以 下 “质变”栏意指mutating,意思是 “会改变其操作对象之内容”)
其余注意事项
- 将无效的迭代器传给某个算法,虽然是一种错误,却不保证能够在编译时期就
被捕捉出来,因为所谓“迭代器类型”并不是真实的型别,它们只是function template
的一种型别参数(type parameters) - 许多STL 算法不只支持一个版本.这一类算法的某个版本采用缺省运算行为,
另一个版本提供额外参数,接受外界传入一个仿函数(functor), 以便采用其他策略。例如 unique() 缺省情况下使用equality操作符来比较两个相邻元素,但如果这些元素的型别并未供应equality操作符,或如果用户希望定义自己的equaHty 操作符,便可以传一个仿函数(fimctor)给另一版本的 unique () 有些算法干脆将这样的两个版本分为两个不同名称的实体,附从的那个总是以作为尾词,例如 find_if (). 另一个例子是replace ( ) , 使用内建的equality操作符进行比对操作,replace_if()则以接收到的仿函数(functor)进行比对行为 - 所有的数值(numeric)算法,包括 adjacent_dif ference () , accumulate (), inner_product () , partial_sum( ) 等等,都实现于 SGI <stl_numeric ,h> 之中,这是个内部文件,S T L 规定用户必须包含的是上层的〈numeric〉。其他STL 算法都实现于SGI的 <stl_algo.h>和<stl_algobase.h>文件中,也都是内部文件;欲使用这些算法,必须先包含上层相关头文件<algorithm>
- 关键在于,只要把操作对象的型别加以抽象化,把操作对象的标示法和区间目标的移动行为抽象化,整个算法也就在一个抽象层面上工作了。整个过程称为算法的泛型化 (generalized), 简称泛化