巧用模板定义谓词

作者在 2008-10-10 23:00:53 发布以下内容


谓词(predicate)是做某些检测的函数,配合标准算法库使用。假设我们要统计一个 vector<int> 里有多少个元素大于 5,则要定义一个谓词函数 gt5:        vector<int>::difference_type cnt = count_if(vec.begin(), vec.end(), gt5);
假设我们还要统计大于 8 的元素的数目,则还要定义一个 gt8。而如果还要统计大于 10、100、150……的元素的数目,则要定义更多的函数。这明显非常不便!使用模板可以解决这个问题:
        template <int N>
        inline bool gt(int n)
        {
            return n > N;
        }
这样,只需定义一个模板,就可以用于统计大于任意值的元素的数目。例如:
        vector<int>::difference_type cnt10  = count_if(vec.begin(), vec.end(), gt<10>);
        vector<int>::difference_type cnt100 = count_if(vec.begin(), vec.end(), gt<100>);
不过,如果需要统计大于 1、2、3、4、5……的元素的数目,使用模板作为谓词也会非常不便,因为需要单独写很多个 count_if。遇到这种情况,就应该使用函数对象,这样的话,就可通过在循环中调用 count_if 来解决问题。
技术 | 阅读 4350 次
文章评论,共1条
vfdff(作者)
2008-10-10 23:02
1
原型&nbsp;&nbsp;&lt;algorithm&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;template&lt;class InputIterator, class Predicate&gt;&nbsp;&nbsp;inline<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t count_if(InputIterator first, InputIterator last, Predicate P)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
注意: 在原型中的类 / 参数名称不匹配标头文件中的版本。 some have been modified to improve readability。<br />
<br />
回到顶端<br />
说明<br />
count_if 算法计算导致返回 true,该谓词的范围 [first, last) 中的元素数并返回为其谓词为 true 元素的数。
游客请输入验证码
浏览1970532次