C++ primer plus 第16章string 类和标准模板库, 函数符概念
C++ primer plus 第16章string 类和标准模板库, 函数符概念
16.5.1 函数符概念
正如 STL定义了容器和迭代器的概念一样,它也定义了函数符概念。
- 生成器(gencrator)是不用参数就可以调用的函数符。
- 一元函数(unaryfunction)是用一个参数可以调用的函数符
- 二元函数(binary function)是用两个参数可以调用的函数符。
例如,提供给foreach()的函数符应当是一元函数,因为它每次用于一个容器元素。当然,这些概念都有相应的改进版:
- 返回 bool值的一元函数是谓词(predicate);
- 返回 bool值的二元函数是二元谓词(binarypredicate)。
些 STL函数需要谓词参数或二元谓词参数。例如,程序清单16.9使用了sor()的这样一个版本,即将二元谓词作为其第3个参数:
bool WorseThan(const Review&rl,const Review&r2);
...
sort(books.begin(),books.end(),worseThan);
list 模板有一个将谓词作为参数的removei)成员,该函数将谓词应用于区间中的每个元素,如果谓词返回 true,则删除这些元素。例如,下面的代码删除链表three 中所有大于100的元素:
bool tooBig(int n){
return n>100}:
list<int> scores;
...
scores.remove_if(tooBig);
最后这个例子演示了类函数符适用的地方。假设要删除另一个链表中所有大于200的值。如果能将取舍值作为第二个参数传递给tooBig(),则可以使用不同的值调用该函数,但谓词只能有一个参数。然而,如果设计一个 TooBig 类,则可以使用类成员而不是函数参数来传递额
template<class T>
class TooBig
private :
T cutoff;
public :
TooBig(const T&t):cutoff(t){
}
bool operator()(constT&v){
return v>cutoff};
}:
这里