一元函數對象、一元謂詞、二元函數對象、二元謂詞

一元函數對象:函數參數1個

二元函數對象:函數參數2個

一元謂詞 函數參數1個,函數返回值是bool類型,可以作爲一個判斷式,謂詞可以是一個仿函數,也可以是一個回調函數。

二元謂詞 函數參數2個,函數返回值是bool類型

之所以給返回布爾類型的函數對象專門命名,是因爲謂詞是用來爲算法判斷服務的。

一元謂詞

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 Fun3()
{
	vector<int> v1;
	for (int i = 10; i < 30; i++)
	{
		v1.push_back(i);
	}
	int divisor = 4;
	IsDiv<int> isDiv(divisor);

	//使用謂詞來做函數參數  返回一個迭代器
	vector<int>::iterator it = find_if(v1.begin(), v1.end(), IsDiv<int>(divisor));
	if (it == v1.end())
	{
		cout << "不能被5整除" << endl;
	}
	else
	{
		cout <<"第一個能被"<< divisor<<"整除的數:"<< *it << endl;
	}

}

find_if使用謂詞來做函數參數  返回一個迭代器的地址

template<class _InIt,
	class _Pr>
	_NODISCARD inline _InIt find_if(_InIt _First, const _InIt _Last, _Pr _Pred)
	{	// find first satisfying _Pred
	_Adl_verify_range(_First, _Last);
	auto _UFirst = _Get_unwrapped(_First);
	const auto _ULast = _Get_unwrapped(_Last);
	for (; _UFirst != _ULast; ++_UFirst)
		{
		if (_Pred(*_UFirst))
			{
			break;
			}
		}

	_Seek_wrapped(_First, _UFirst);
	return (_First);
	}

二元函數對象

template <typename T>
class SumAdd
{
public:
	T operator()(T &t1, T &t2)
	{
		return t1 + t2;
	}
};

void Fun4()
{
	vector<int> v1, v2, v3;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);

	v2.push_back(4);
	v2.push_back(5);
	v2.push_back(6);

	v3.resize(5);

	transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), SumAdd<int>());
	for (vector<int>::iterator it = v3.begin();it <v3.end();it++)
	{
		cout << *it << " ";
	}
}

二元謂詞

bool MyCompare(const int &a,const int &b)
{
	return a < b;
}

void Fun5()
{
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(rand() % 100);
	}
	for_each(v1.begin(), v1.end(), PrintElement1<int>);

	cout << "排序之後" << endl;
	sort(v1.begin(), v1.end(), MyCompare);
	for_each(v1.begin(), v1.end(), PrintElement2);

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章