博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++的bind1st()与bind2nd() 二元算子转一元算子
阅读量:5297 次
发布时间:2019-06-14

本文共 1741 字,大约阅读时间需要 5 分钟。

bind1st()和bind2nd()是两个函数,用于将二元算子转成一元算子。


何谓二元算子?

比如< > =等等这些就是二元算子,即需要两个操作数的运算符。

何谓一元算子?

比如++ --等等这些就是一元算子,即只需要一个操作数的运算符。


bind2st()的使用

其实这个函数并没有强大到可以真的实现二元算子转一元算子,只是在特定的场合用起来会很有用而已。看下面的例子

int main(){    int a[] = {1, 2, 100, 200};    // 用数组a来初始化arr    std::vector< int> arr(a, a + 4);      // 移除arr中小于100的所有元素    arr.erase(         std::remove_if( arr.begin(),  arr.end(),  std::bind2nd( std::less< int>(), 100) ),         arr.end()    );    for(int i=0; i

remove_if不熟悉的话请看下面的接口定义

template 
ForwardIterator remove_if(ForwardIterator first, ForwardIterator last, UnaryPredicate pred);

功能就是剔除从[first, last)中所有符合表达式pred的元素,返回一个ForwardIterator迭代器指向处理过的数组的end端。

比如有数组a[] = {1, 2, 100, 200},剔除掉小于100的元素,处理过后变成a[] = {100, 200, 100, 200};

比如有数组a[] = {1, 100, 2, 200},剔除掉小于100的元素,处理过后变成a[] = {100, 200, 2, 200};

以上两个例子的返回值均是指向a[2],可以看出,其实就是将不符合表达式pred的元素全部移到数组a的前部而已,而后面的部分完全是未处理之前的一模一样,应该将a[2~3]删除掉才能达到我们的目的,故需要使用到erase()这个函数,处理过程已在上面的代码中。

bind1st()的使用

// 移除所有大于100的元素,与上例相反    arr.erase(         std::remove_if( arr.begin(),  arr.end(),  std::bind1nd( std::less< int>(), 100) ),         arr.end()    );

这里的表达式std::bind1nd( std::less< int>(), 100)相当于100 < arr.value,而上个例子中std::bind2nd( std::less< int>(), 100)相当于arr.value < 100。聪明的人想到了一种用bind2nd也能实现移除所有大于100的元素的效果,那就是换个运算符,像这样

arr.erase(         std::remove_if( arr.begin(),  arr.end(),  std::bind2nd( std::greater< int>(), 100) ),         arr.end()    );

这样也是OK的。

要实现小于等于怎么办?

STD提供了not1()函数,相当于逻辑运算符!。如果要实现a <= b,可以换种写法,像这样!( a > b ),那么not1()就可以派上用场了。

std::remove_if(        arr.begin(),          arr.end(),          std::not1( std::bind2nd( std::greater
(), 100)) // 相当于 !( arr.value > 100 ) )

参考文章

转载于:https://www.cnblogs.com/xcw0754/p/8311030.html

你可能感兴趣的文章
Leetcode: Find Leaves of Binary Tree
查看>>
Vue 模板解释
查看>>
http://www.bootcss.com/
查看>>
20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
查看>>
将多张图片和文字合成一张图片
查看>>
自己动手写ORM(01):解析表达式树生成Sql碎片
查看>>
如何使用USBWebserver在本机快速建立网站测试环境
查看>>
百度Ueditor编辑器的Html模式自动替换样式的解决方法
查看>>
变量提升
查看>>
线性表可用顺序表或链表存储的优缺点
查看>>
在现有的mysql主从基础上,搭建mycat实现数据的读写分离
查看>>
[Flex] flex手机项目如何限制横竖屏?只允许横屏?
查看>>
tensorflow的graph和session
查看>>
JavaScript动画打开半透明提示层
查看>>
Mybatis生成resulteMap时的注意事项
查看>>
jquery-jqzoom 插件 用例
查看>>
1007. Maximum Subsequence Sum (25)
查看>>
iframe的父子层跨域 用了百度的postMessage()方法
查看>>
图片生成缩略图
查看>>
动态规划 例子与复杂度
查看>>