【转】 bind1st bind2nd的使用

以前在使用stl的过程中发现bind1st和bind2nd这两个函数,当时不太理解什么意思,今天在网上查了一下相关资料发现竟然很简单,下面我就具体解释一下他们的用法。

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>

时间: 2024-12-13 07:41:00

【转】 bind1st bind2nd的使用的相关文章

not1,not2,bind1st,bind2nd

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

c++ bind1st bind2nd的使用

看了下面这篇文章后,简短总结:bind2nd( 参数1,参数2)   表示的是一个判断条件,假如参数1是个小于号<,而参数2是个100,那么表达的就“小于100”的意思,将两个东西结合在一起表示.bind1st( 参数1,参数2)  表达的与bind2nd恰好相反,即假如参数1与参数2与bind2nd完全一样,表达的是“大于100”的意思. 以上只是一总抽象的总结性,你理解了这个大概的意思,再看下面具体的介绍之后比较容易理解. 转载自http://blog.csdn.net/simahao/ar

STL适配器(adapters)

定义:将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作.适配器扮演者轴承.转换器的角色. 分类: 1.容器适配器:改变容器接口. STL提供两个容器迭代器:queue和stack.它们都是修饰deque后成为另一种风貌的容器. 2.迭代器适配器:改变迭代器接口. Insert Iterator:将容器绑定到back_insert_iterator.front_insert_iterator.insert_iterator.它们都是一个

C++标准 bind函数用法与C#简单实现

在看C++标准程序库书中,看到bind1st,bind2nd及bind的用法,当时就有一种熟悉感,仔细想了下,是F#里提到的柯里化.下面是维基百科的解释:在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术. 下面来看一个简单的例子. void mult(int& a, int b) { cout << "a:" <&

C++ STL 基础及应用(7) 函数对象(仿函数)

把函数作为对象是程序设计的新思维.STL 通过重载类中的 operator() 函数实现函数对象功能,不但可以对容器中的数据进行各种各样的操作,而且能够维护自己的状态.因此,与标准 C 库函数相比,函数对象更为通用. 本章将介绍函数指针的使用.函数对象的定义.引入目的.使用方法,C++98 标准和C++11标准下 STL 内置函数对象的详细介绍.适配器类的使用.包括 bind1st bind2nd not1 not2 mem_fun mem_fun_ref ptr_fun bind ref cr

C++自问自答

1.为什么派生层次上的类,同一个虚函数在各个类的虚表中的位置一样?         因为:对虚函数的调用是通过虚指针+偏移地址构成,由于对虚函数的调用都是通过这种方式,所以对同一个虚函数的偏移值就必须相同. 2.为防止对象切片有什么办法?      可以将基类定义为纯虚类 3.为什么构造函数里面的虚机制不起作用? a.如果构造函数调用层次上,中间构造函数调用的虚函数属于派生类,由于派生类为初始化完成,所以会有问题.   b.调用层次上的每一个构造函数,都会使虚指针指向该构造函数所属的类的虚表,而

C++函数适配器

先弄清几个概念,什么叫一元函数,二元函数 1.    一元函数一个参数2. 二元函数 两个参数3. 一元谓词 一个参数,返回类型为bool型4. 二元谓词 两个参数,返回类型为bool型 函数适配器是用来让一个函数对象表现出另外一种类型的函数对象的特征.因为,许多情况下,我们所持有的函数对象或普通函数的参数个数或是返回值类型并不是我们想要的,这时候就需要函数适配器来为我们的函数进行适配 C++中有三类适配器,分别是容器适配器,迭代器适配器和函数适配器,这里主要介绍函数适配器.函数适配器用于特化和

boost中bind的使用

.markdown-preview:not([data-use-github-style]) { padding: 2em; font-size: 1.2em; color: rgb(171, 178, 191); background-color: rgb(40, 44, 52); overflow: auto } .markdown-preview:not([data-use-github-style])>:first-child { margin-top: 0px } .markdown-

STL基础--仿函数(函数对象)

1 首先看个仿函数的例子 class X { public: void operator()(string str) { // 函数调用运算符,返回类型在operator之前 cout << "Calling functor X with parameter " << str<< endl; } operator string () const { return "X"; } //类型转换函数,返回类型在operator之后 };