函数对象,一元谓词,这些才听,觉得有点陌生,
函数对象:
重载函数调用操作符的类,其对象常称为函数对象(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();
}
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
#include <set>
using namespace std;
template <typename T>
class isDiv
{
public:
isDiv(const T &divisor)
{
this->divisor = divisor;
}
bool operator()(T &t)
{
return (t % divisor == 0);
}
private:
T divisor;
};
void fun()
{
vector<int> vec;
for (int i=10;i<33;i++)
{
vec.push_back(i);
}
int a = 4;
isDiv<int> myDiv(a);
vector<int>::iterator it;
//find_if(vec.begin(), vec.end(), myDiv);第一种写法
it = find_if(vec.begin(), vec.end(), isDiv<int>(4));//find_if返回一个迭代器
if (it == vec.end())
{
cout << "元素中没有可以被4整除的值" << endl;
}
else
{
cout << "可以被4整除的值:" << *it << endl;
}
}
struct CompareNoCase
{
bool operator()(const string& str1,const string& str2) const
{
string str1_,str2_;
str1_.resize(str1.size());
transform(str1.begin(), str1.end(), str1_.begin(), tolower);
str2_.resize(str2.size());
transform(str2.begin(), str2.end(), str2_.begin(), tolower);
return (str1_ < str2_);
}
};
void fun02()
{
set<string, CompareNoCase> set1;
set1.insert("aaa");
set1.insert("bbb");
set1.insert("ccc");
set<string, CompareNoCase>::iterator it = set1.find("aAa");
if (it != set1.end())
{
cout << "找到aAa" << endl;
}
else
{
cout << "没有找到aAa" << endl;
}
}
void main()
{
fun();
//利用二元谓词实现不区分大小写查询set
fun02();
system("pause");
}
转自: https://blog.csdn.net/qq_18973645/article/details/54605319