stl算法设计理念_一元函数对象和一元谓词

函数对象,一元谓词,这些才听,觉得有点陌生,

 

函数对象:

重载函数调用操作符的类,其对象常称为函数对象(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值