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<arr.size(); i++) std::cout<<arr[i]<<std::endl; // 输出: 100 200
return 0;
}

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

template <class ForwardIterator, class UnaryPredicate>
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<int>(), 100)) // 相当于 !( arr.value > 100 )
)

参考文章 点我直达

c++的bind1st()与bind2nd() 二元算子转一元算子的更多相关文章

  1. c++ bind1st 和 bind2nd的用法

    std::bind1st 和 std::bind2nd将二元函数转换为一元函数,具体用法参加下面的代码. 代码介绍了两种使用方式,第一种是使用std::less和std::greater,第二种是使用 ...

  2. not1,not2,bind1st和bind2nd详解

    1.引言 bind1st和bind2nd函数用于将一个二元函数对象(binary functor,bf)转换成一元函数对象(unary functor,uf).为了达到这个目的,它们需要两个参数:要转 ...

  3. 机器学习进阶-图像梯度计算-scharr算子与laplacian算子(拉普拉斯) 1.cv2.Scharr(使用scharr算子进行计算) 2.cv2.laplician(使用拉普拉斯算子进行计算)

    1. cv2.Scharr(src,ddepth, dx, dy), 使用Scharr算子进行计算 参数说明:src表示输入的图片,ddepth表示图片的深度,通常使用-1, 这里使用cv2.CV_6 ...

  4. 学习 opencv---(11)OpenC 边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器

    本篇文章中,我们将一起学习OpenCV中边缘检测的各种算子和滤波器——Canny算子,Sobel算子,Laplace算子以及Scharr滤波器.文章中包含了五个浅墨为大家准备的详细注释的博文配套源代码 ...

  5. OpenCV2马拉松第15圈——边缘检測(Laplace算子,LOG算子)

    收入囊中 拉普拉斯算子 LOG算子(高斯拉普拉斯算子) OpenCV Laplacian函数 构建自己的拉普拉斯算子 利用拉普拉斯算子进行图像的锐化 葵花宝典 在OpenCV2马拉松第14圈--边缘检 ...

  6. Python 图像处理 OpenCV (12): Roberts 算子、 Prewitt 算子、 Sobel 算子和 Laplacian 算子边缘检测技术

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  7. Spark算子篇 --Spark算子之aggregateByKey详解

    一.基本介绍 rdd.aggregateByKey(3, seqFunc, combFunc) 其中第一个函数是初始值 3代表每次分完组之后的每个组的初始值. seqFunc代表combine的聚合逻 ...

  8. OpenCV——边缘检测(sobel算子、Laplacian算子、scharr滤波器)

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  9. python自编程序实现——robert算子、sobel算子、Laplace算子进行图像边缘提取

    实现思路: 1,将传进来的图片矩阵用算子进行卷积求和(卷积和取绝对值) 2,用新的矩阵(与原图一样大小)去接收每次的卷积和的值 3,卷积图片所有的像素点后,把新的矩阵数据类型转化为uint8 注意: ...

随机推荐

  1. day_06 再谈编码

    1. 小数据池(常量池) 1.id() 通过id()查询一个变量在内存中的地址 2.is和== 1.is 判断左右两端内存地址是否一致,如果返回值是TRUE,则可以判断这两个变量值是同一对象 2.== ...

  2. Qt中的标准对话框

    1. Qt为开发者提供了一些可复用的对话框类型,如QMessageBox,QFileDialog,QPrintDialog, QColorDialog, QInputDialog, QProgress ...

  3. 省市联动 js

    工作中见到这个省市联动代码,虽然很简单也能写出来,还是随便把它记录下来. //省市联动 function area(obj_id, area_pId, data_call_back) { ) retu ...

  4. Apache HttpClient 4.3.6 API

    官网:http://hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/overview-summary.html 使用教程转载: ...

  5. Spyder清除Variable Explorer&&手动安装protobuf3.0(为了配置windows的python接口)

    输入:reset 选择:y PS:建议在windows下,安装anaconda32bit版本的,可以兼容更多第三方包.   Conda使用清华镜像 配置镜像 在conda安装好之后,默认的镜像是官方的 ...

  6. spring boot——常用注解

    @SpringBootApplication:申明让spring boot自动给程序进行必要的配置,这个配置等同于:@Configuration ,@EnableAutoConfiguration 和 ...

  7. oracle merge into函数中插入clob字段

    当使用Merge into 函数向ORACLE数据库中插入或更新数据时,报错“ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”,使用如下方法可以把String转换为clob. 需 ...

  8. C++的静态Static

    类的静态数据成员是属于类(即与类关联)而不属于类的每个对象(不与类的每个对象关联)(相当于该静态对象在所有的类对象中共享.),所以初始化方法与一般的变量不同,需要在类的构造函数之外进行初始化. 类的静 ...

  9. thinkphp3.2 删除Runtime目录里的缓存文件,标记一下,以下好找。

    操作如下: utility::clearCache("Data"); 或 utility::clearCache("Data-Logs"); class uti ...

  10. (转)DNS原理及其解析过程

    DNS原理及其解析过程原文:http://blog.51cto.com/369369/812889 网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能 ...