绑定器和函数对象
函数对象
函数对象就是类方法中有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.