作者在 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 来解决问题。
假设我们还要统计大于 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 来解决问题。