目录
1.五类迭代器
2.算法形参模式
3.算法命名规范
除了参数规范,算法还遵循一套命名和重载规范。这些规范处理诸如:如何提供一个操作代替默认的<或==运算符以及算法是将输出数据写入输入序列还是一个分离的目的位置等问题
一些算法使用重载形式传递一个谓词
接受谓词参数来代替<或==的算法,以及那些不接受额外参数的算法,通常都是重载的函数。函数的一个版本用元素类型的运算符来比较元素;另一个版本接受一个额外谓词参数来代替<或==:
unique(beg,end);//用==比较元素
unique(beg,end,comp);//用comp比较元素
由于参数个数不等,所以调用无歧义
_if版本的算法
接受一个元素值得算法通常有另一个不同名的版本,该版本接受一个谓词代替元素值。接受谓词参数的算法都有附加的_if前缀:
find(beg,end,val);//查找输入范围中val第一次出现的位置
find_if(beg,end,pred);//查找第一个令pred为真的元素
由于参数的数目相等,为了避免任何可能的歧义,标准库选择提供不同名字的二版本而不是重载。
区分拷贝元素的版本和不拷贝的版本
默认情况下,重排元素的算法将重排后的元素写回给定的输入序列中。这些算法还提供另一个版本,将元素写道一个指定的输出目的位置。如我们所见,写到额外目的空间的算法都在名字后面附加一个_copy
reverse(beg,end);//反转输入范围中元素的顺序
reverse_copy(beg,end,dest);//将元素按逆序拷贝到dest
一些算法同时提供_copy和_if版本。这些版本接受一个目的位置迭代器和一个谓词:
//从v1中删除奇数元素
remove_if(v1.begin(),v1.begin(),[](int i){return i % 2;});
//将偶数元素从v1拷贝到v2;v1不变
remove_copy_if(v1.begin(),v1.end(),back_inserter(v2),
[](int i){return i%2;});