bind1st bind2nd的使用

Posted on 2010-07-16 09:14 wanpengcoder 阅读(1882) 评论(0) 编辑 收藏

bind1st和bind2nd函数用于将一个二元算子(binary functor,bf)转换成一元算子(unary functor,uf)。为了达到这个目的,它们需要两个参数:要转换的bf和一个值(v)。 
可能这么解释以后大家还不是很清楚,那么就说点白话吧。我们在做比较的时候所写的表达式像 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它是否定返回值是双目的函数
例子需要包含头文件
#include <vector>
#include <algorithm>
#include <functional>
 

bind1st bind2nd的使用相关推荐

  1. 关于标准库中的ptr_fun/binary_function/bind1st/bind2nd

    http://www.cnblogs.com/shootingstars/archive/2008/11/14/860042.html 以前使用bind1st以及bind2nd很少,后来发现这两个函数 ...

  2. C++for_each| bind1st | ptr_fun | std::function的用法

    c++ for_each 用法_小键233-CSDN博客 传入参数 要传入参数给global function ,需要使用 ptr_fun() 这个 function adapter 将global ...

  3. c++ Boost库之boost::bind学习

    刚开始学c++,就看boost库其实有点小小的不情愿. 团队要求必掌握的Boost库: boost::bind boost::function boost::Signals2 学习前奏:在写关于coc ...

  4. c++11-std::functionbind

    std::function 可调用对象如下: 是一个函数指针 一个具有operator()成员函数的类对象 一个可被转换为函数指针的类对象 是一个类成员指针 std::function是可调用对象包装 ...

  5. [转]【C/C++】STL详解

      转载备用,原创作者在文章结尾... 文章目录 概述 STL六大组件简介 三大组件介绍 1. 容器 2. 算法 3. 迭代器 常用容器 1. string容器 string容器基本概念 string ...

  6. 【C/C++学习】之STL详解

    文章目录 概述 STL六大组件简介 三大组件介绍 容器 算法 迭代器 常用容器 1. string容器 string容器基本概念           string容器常用操作 2. vector容器 ...

  7. 《Boost程序完全开发指南》

    1.3开发环境 由于Boost大量使用了C++高级特性(如模板偏特化.ADL),因此不是所有的编译器都 能够很好地支持Boost. 在VC集成环境中使用嵌入工程编译的方式需要定义宏BOOST_ALL_ ...

  8. c++实现STL标准库

    本次课程主要面对有一定 c++ 基础(了解基本语法,熟悉常用特性)的 ,想要学习 c++ 更深入特性 ,掌握 c++ 强大标准库的同学 .通过本次课程,你将学习到 c++ template ,异常处理 ...

  9. 《EffcativeSTL》

    定义.使用和扩展STL 没有"STL"的官方定义,在本书中,"STL"的意思是与迭代器合作的C++标准库的一部 分.那包括标准容器(包括string),iost ...

最新文章

  1. 计算机组成原理ALU加法器
  2. GitHub 博客-- Jekyll--代码高亮,Liquid 转义字符
  3. 小学期学习记录(一)
  4. Interactive Reflection Editing (SIGGRAPH ASIA 09)
  5. 机器学习(一)—— 线性回归
  6. 什么是CDI,它与@EJB和Spring有什么关系?
  7. 广东省计算机学校哪所最好,广东省哪个技校比较好哪里好
  8. hadoop大数据开发基础_Java大数据开发(三)Hadoop(2)经典的Hadoop
  9. 100万并发连接服务器笔记之处理端口数量受限问题
  10. 雪城大学信息安全讲义 4.5
  11. 能看懂vue源码什么水平_送你 Vue 学习路线的最佳实践
  12. Sunday算法模板
  13. Java并发编程之ConcurrentLinkedQueue详解
  14. 【云周刊】第145期:2017天猫双11总交易额1682亿,背后阿里绝密50+技术揭秘!
  15. linux qt计算器,QT 计算器小程序
  16. 程序设计基础基于C语言(第二版),程序设计基础_基于C语言(第2版)__课后习题参考答案.doc...
  17. 《基于双阶段支持向量机的电力系统暂态稳定预测及控制》总结
  18. 均匀分布的期望和方差的推导_均匀分布的期望和方差(D(X)与E(X)公式)
  19. Android DNK安装笔记
  20. 【FPGA教程案例61】硬件开发板调试1——初识FPGA开发板,通过verilog控制LED灯,按键开关等

热门文章

  1. 浙江金融职业学院计算机一级,浙江金融职业学院全景-360度,720度,高清全景地图-expoon网展...
  2. linux中samba详解,详解linux系列之samba的安装及配置
  3. 【渝粤教育】 国家开放大学2020年春季 2134成本会计 参考试题
  4. 【渝粤教育】广东开放大学 PHP动态网站设计 形成性考核 (48)
  5. mysql 横向分表合并_MySQL横向扩展-分库分表解决方案总结
  6. 擦地机器人修理_自带眼睛还有嘴,喷水式擦地机器人效果实测
  7. linux结束所有任务命令行,Linux基础命令(15)定时任务
  8. android 号码查联系人,Android联系人查询
  9. 计算机二级web题目(8.3)--简单应用题2
  10. python统计图像直方图_计算机视觉7-像素点直方图统计、掩膜图像