绑定器和函数对象

函数对象

函数对象就是类方法中有operator()运算符重载的。在使用时和函数很类似。

绑定器

在C++ STL库中有两个绑定器:

bind1st: operator()的第一个形参变量绑定成一个确定的值。
bind2nd:operator()的第二个形参变量绑定成一个确定的值。

绑定器的使用

int main()
{
   
	vector<int> vec;
	srand(time(nullptr));
	//初始化容器中的变量
	for (int i = 0; i < 20 ; ++i)
	{
   
		vec.push_back(rand() % 100 + 1);
	}
	
	sort(vec.begin(), vec.end(), greater<int>()); // 大到小排序
	
	//在这里我们把元素70按序插入
	auto it1 = my_find_if(vec.begin(), vec.end(),
		bind1st(greater<int>(), 70));
	
	if (it1 != vec.end())
	{
   
		vec.insert(it1, 70);
	}

	return 0;
}

代码解释:
greater函数对象,是一个二元函数,在bind1st(greater<int>(), 70);中,我们将其第一个参数绑定为70,将其变为一个一元函数对象。

从容器中大到小每个数据与70比较,找到第一个小于70的,返回其迭代器。

当然我们也可以绑定less的第二个参数bind2nd(less<int>(),70);

绑定器的底层实现

先来看find_if函数,它需要的是一个一元函数对象comp。

template<typename Iterator, typename Compare>
Iterator my_find_if(Iterator first, Iterator last, Compare comp)
{
   
	for (; first != last; ++first)
	{
   
		if (comp(*first)) // comp.operator()(*first)
		{
   
			return first;
		}
	}
	return last;
}

那么这个一元函数对象由如何由二元函数对象实现呢?请看下面的代码。

template<typename Compare, typename T>
_mybind1st<Compare,T> mybind1st(Compare comp, const T &val)
{
   
	//直接返回一个一元函数对象
	return _mybind1st<Compare, T>(comp, val);
}
template<typename Compare, typename T>
class _mybind1st // 绑定器是函数对象的一个应用
{
   
public:
	_mybind1st(Compare comp, T val)
		:_comp(comp), _val(val) 
	{
   }
	bool operator()(const T &second)
	{
   
		return _comp(_val, second); // greater
	}
private:
	Compare _comp;
	T _val;
};

说白了,其实就是对二元函数对象的一个封装而已。

拜拜!

参考文献

[1] 施磊.腾讯课堂——C++高级.图论科技,2020.7.