C++的函数适配器

函数适配器分为四大类:绑定适配器,组合适配器,指针函数适配器,成员函数适配器。

下例中包含了常用的四个:

  •   bind1st(op, value); 绑定到二元函数对象的第一个参数
  •   bind2nd(op, value);绑定到二元函数对象的第二个参数
  •   not1(op); 翻转一元预定义函数对象的真值
  •   not2(op);翻转二元预定义函数对象的真值
#include 
using namespace std;
#include "vector"
#include  
#include "functional"


class IsGreat
{
public:
	IsGreat(int num)
	{
		this->i_num = num;
	}
	bool operator()(const int num)
	{
		if (i_num > num)
		{
			return false;
		}
		else
		{
			return true;
		}
	}

private:
	int i_num;
};


int main()
{
	vector v1;
	for (int i = 0; i < 10; ++i)
	{
		v1.push_back(i + 1);
	}

	for (vector::iterator it = v1.begin(); it != v1.end(); ++it)
	{
		cout << *it << "   ";
	}
	cout << endl;
	//使用自己写的函数对象
	int num = count_if(v1.begin(), v1.end(), IsGreat(3));
	cout << num << endl;

	//使用预定义的函数对象
	/*template 
	struct greater { // functor for operator>
		_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type;
		_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type;
		_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef bool result_type;

		constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const { // apply operator> to operands
			return _Left > _Right;
		}
	};*/

	//通过预定义的函数对象,求大于2的个数
	//greater()有两个参数 左参数来自容器的元素, 右元素固定成2(通过bind2nd)
	int num1 = count_if(v1.begin(), v1.end(), bind2nd(greater(), 2));
	cout << num1 << endl;

	//奇数的个数
	int num2 = count_if(v1.begin(), v1.end(), bind2nd(modulus(), 2));
	cout << num2 << endl;

	//偶数的个数
	int num3 = count_if(v1.begin(), v1.end(), not1( bind2nd(modulus(), 2)));
	cout << num3 << endl;
	return 0;
}

  

转载于:https://www.cnblogs.com/qkqBeer/articles/10848014.html

你可能感兴趣的:(c/c++)