传智扫地僧课程学习笔记。
函数对象,一元谓词,这些才听,觉得有点陌生,
函数对象:
重载函数调用操作符的类,其对象常称为函数对象(functionobject),即它们是行为类似函数的对象。一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待。
这是通过重载类的operator()来实现的。
“在标准库中,函数对象被广泛地使用以获得弹性”,标准库中的很多算法都可以使用函数对象或者函数来作为自定的回调行为;
谓词:
一元函数对象:函数参数1个;
二元函数对象:函数参数2个;
一元谓词函数参数1个,函数返回值是bool类型,可以作为一个判断式
谓词可以使一个仿函数,也可以是一个回调函数。
二元谓词函数参数2个,函数返回值是bool类型
一元谓词函数举例如下
1,判断给出的string对象的长度是否小于6
bool GT6(const string &s)
{
return s.size()>= 6;
}
2,判断给出的int是否在3到8之间
bool Compare( int i )
{
return ( i >=3 && i <= 8 );
}
二元谓词举例如下
1,比较两个string对象,返回一个bool值,指出第一个string是否比第二个短
bool isShorter(const string &s1, conststring &s2)
{
return s1.size()< s2.size();
}
template<typename T>
class IsDiv
{
public:
IsDiv(const T &divisor)
{
this->divisor = divisor;
}
bool operator()(T &t)
{
return (t%divisor == 0);
}
protected:
private:
T divisor;
};
void main03()
{
vector<int> v2;
for (int i=10; i<33; i++)
{
v2.push_back(i);
}
int a = 4;
IsDiv<int> myDiv(a);
//find_if(v2.begin(), v2.end(), myDiv );
/*
template<class _InIt,
class _Pr> inline
_InIt find_if(_InIt _First, _InIt _Last, _Pr _Pred)
{ // find first satisfying _Pred
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Pred);
return (_Rechecked(_First,
_Find_if(_Unchecked(_First), _Unchecked(_Last), _Pred)));
}
//find_if返回值是一个迭代器
//要点: 分清楚 stl算法返回的值是迭代器 还是 谓词(函数对象) 是stl算法入门的重要点
*/
vector<int>::iterator it;
it = find_if(v2.begin(), v2.end(), IsDiv<int>(a) );
if (it == v2.end())
{
cout << "容器中没有被4整除的元素" << endl;
}
else
{
cout <<"第一个是被4整除的元素是:" << *it << endl;
}
}