6.4 创建自己的STL风格算法

只要适应了STL算法的风格,用户就可以开始创建自己的通用算法。因为这些算法符合STL中对所有其他算法的约定,使用自己编写的通用算法对熟悉STL的程序员来说更加容易,因此这也成为“扩展STL词汇表”的一种方式。

解决这个问题最容易的方法是在头文件<algorithm>中,找到那些与所需要的功能相似的一些算法并将其作为样板,在其后模仿编写自己的代码。[1](事实上,在头文件中所有STL实现都对模板直接提供代码。)

如果仔细观察标准C++库中算法的列表,就可能注意到一个明显的遗漏:没有copy_if()算法。尽管用remove_copy_if()可以完成相同的效果,但这样做相当不方便,因为必须要转化判定条件。(记住,remove_copy_if()仅复制那些不满足判定条件的元素,并有效地删除那些满足判定条件的元素。)

读者可能对用编写一个函数对象适配器来完成这项工作感兴趣,在将函数对象适配器传递给remove_copy_if()之前要取消掉那些不满足判定函数的元素,这意味着要通过如下的声明来完成:

6.4 创建自己的STL风格算法 - 图1

这看上去很合理,但是当读者想起使用判定函数时,而该判定函数是一个指向尚未完善的函数的指针,就会看到为什么它不能工作—not1期望的是一个能适应的函数对象,而现在不是这样。编写copy if()的惟一解决方法是从零开始做起。既然从查阅其他复制算法中了解到对输入和输出需要两个单独的迭代器,那么就可以用下面的例子完成这一工作:

6.4 创建自己的STL风格算法 - 图2

注意,begin的自增运算不能完整地进入到复制表达式之内。

[1]当然,没有违反任何版权保护法律。