stl中 bind1st和 bind2nd 以及not1等适配器的使用

本文详细介绍了STL中bind1st、bind2nd适配器的用途,以及如何通过not1实现不等式比较。通过示例代码展示了如何使用这些适配器进行数据筛选操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                            stl中 bind1st和 bind2nd  以及not1 等适配器的使用

         以上总结部分拷贝自:http://blog.youkuaiyun.com/yzm365487848/article/details/5568608  ,对该博客朋友表示感谢。

        在我们使用stl的 一些算法的时候,比如find_if等,需要使用仿函数,如果仿函数有2个参数,但是算法需要一个一元的仿函数的时候,我们可以使用适配器,比如:bind1st和bind2nd来将仿函数适配成一元的操作符。

     bind1st表示我们绑定第一个参数,bind2st表示我们绑定第二个参数。not1表示跟想要的相反。

     

    可能这么解释以后大家还不是很清楚,那么就说点白话吧。
   我们在做比较的时候所写的表达式像 x > k ,x < k,这里的
   k是一个参数表示你程序里面的表达式要和k值去比较。
   上面这两个表达式对应的应该是bind2nd ,简单的理解就是把
   k作为比较表达式的第二个参数。如果使用bind1st则对应的
   表达式是 k > x,k < x,也就是把k作为比较表达式的第一个参数。
   大家可能会注意到这里面没有=的比较,先别着急,
   后面将会说道如何实现=的比较。先举两个例子看看 bind1st和bind2nd的用法。



int a[] = {1, 2, 100, 200};

std::vector< int> arr(a, a + 4);




// 移除所有小于100的元素
arr.erase( std::remove_if( arr.begin(), arr.end(),
     std::bind2nd( std::less< int>(), 100)), arr.end());

这里的比较表达式相当于arr.value < 100





如果用bind1st则表达的意思就恰恰相反

// 移除所有大于100的元素
arr.erase( std::remove_if( arr.begin(), arr.end(),
     std::bind1st( std::less< int>(), 100)), arr.end());

这里的表达式相当于100 < arr.value



当然为了实现删除大于100的元素你同样可以使用bind2nd

// 移除所有大于100的元素
arr.erase( std::remove_if( arr.begin(), arr.end(),
     std::bind2nd( std::greater< int>(), 100)), arr.end());



前面说道=的比较,比如说x <= k怎么实现呢,std又提供了一个好东西not1,
我们可以说 !(x > k) 和 x <= k是等价的,那么我们看看下面的表达式:

// 移除所有小于等于100的元素
arr.erase( std::remove_if( arr.begin(), arr.end(),
     std::not1(std::bind2nd( std::greater< int>(), 100))), arr.end());

说明:not1是否定返回值是单目的函数,std中还有not2它是否定返回值是双目的函数。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值