c/c++ 标准库 bind 函数 详解

标准库 bind 函数 详解

bind函数:接收一个函数名作为参数,生成一个新的函数。

auto newCallable = bind(callbale, arg_list);

arg_list中的参数可能包含入_1, _2等,这些是新函数newCallable的参数。

在这篇博客lambda 表达式 介绍 中,讨论了find_if的第三个参数的问题,当时是用lambda表达式解决的,有了bind函数后,也可以用bind函数解决。

解决办法:bind(check_size, _1, sz)

auto idx = find_if(svec.begin(),svec.end(),bind(check_size, _1, 6));

其实,newCall= bind(check_size, _1, sz)返回了一个新的函数newCall ,这个newCall 只接受一个参数,正好满足find_if的要求。

  • 从find_if的角度来看,啊,newCall是含有一个参数的函数,OK,没问题。
  • 从程序猿的角度看,check_size是含有2个参数的函数,只是提前把sz(6)绑定到了newCall上了,
  • 当调用newCall(s),实际是调用了check_size(s, 6),相当于newCall也有2个参数,只是第二个参数有个默认值为6。newCall(const string &s, size_t sz = 6); ,所以调用newCall时,传递一个参数就够了。

注意:_1,_2等,是放在了命名空间placeholder中,所以要使用:

//_1,_n定在std::placeholders里面
using namespace std::placeholders;

bind参数用法:

//g是以个有2个参数的可调用对象
auto g = bind(func, a, b, _2, c, _1);//func是有5个参数的函数
调用g(X, Y), 等于 func(a, b, Y, c, X)

例子:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <functional>

using namespace std;
//_1,_n定在std::placeholders里面
using namespace std::placeholders;

bool check_size(const string &s, string::size_type sz){
  return s.size() >= sz;
}
bool shorter(const string &a, const string &b){
  return a.size() < b.size();
}
ostream& print(ostream& os, const string &s, const char &c){
  //c = ‘,‘;
  return os << s << c;
}
int main(){

  /*
  //用bind实现了和lambda一样的功能
  vector<string> svec{"aab","d","aa","bb","e","bbb"};
  stable_sort(svec.begin(),svec.end(),[](const string &a, const string &b){
      return a.size() < b.size();
    });
  string::size_type sz = 3;
  auto idx = find_if(svec.begin(),svec.end(),bind(check_size, _1, sz));
  cout << *idx << endl;
  idx = find_if(svec.begin(),svec.end(),[sz](const string &s){
      return s.size() >= sz;
    });
  cout << *idx << endl;
  */

  /*
  //用bind改变原来函数的参数的位置
  //升序
  vector<string> svec{"aab","d","aa","bb","e","bbb"};
  sort(svec.begin(), svec.end(), shorter);
  for(auto const &s : svec){
    cout << s << " ";
  }
  cout << endl;
  //由于调换了shorter参数的位置,所以变成了降序
  sort(svec.begin(), svec.end(),bind(shorter, _2, _1));
  for(auto const &s : svec){
    cout << s << " ";
  }
  cout << endl;
  */

  //bind引用,必须使用ref或者cref函数,把对象转化成引用,不能用&
  ostream &os = cout;
  const char c = ‘ ‘;
  vector<string> svec{"aab","d","aa","bb","e","bbb"};
  for_each(svec.begin(),svec.end(),[&os, c](const string &s){
      os << s << c;
    });
  os << endl;
  for_each(svec.begin(),svec.end(),bind(print, ref(os), _1, cref(c)));
  os << endl;
  cout << c << endl;

}

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

原文地址:https://www.cnblogs.com/xiaoshiwang/p/9678769.html

时间: 2024-10-25 02:27:58

c/c++ 标准库 bind 函数 详解的相关文章

银钻娱乐客服15687949443开户关于bind()函数详解

相信很多接触过jQuery的小伙伴对bind()函数一点都不陌生吧,但是很多小伙伴还不是很清bind()的含义与使用,bind()函数用于为每个匹配元素的一个或多个事件绑定事件处理函数.今天我们就带大家详细介绍下jQuery中关于bind()函数详解! 此外,你还可以额外传递给事件处理函数一些所需的数据. 执行bind()时,事件处理函数会绑定到每个匹配元素上.因此你使用bind()所有button元素绑定了click事件,是为当时文档中存在的每个button元素绑定click事件.如果之后你向

linux 标准I/O函数详解

1.I/O操作是系统的基础. I/O 表示的input[输入]和output[输出] .I/O操作是系统实现的基础.如果没有I/O操作,所以有的系统文件将无法存储,更谈不上处理与分析,系统运行的结果也不为用户所见. 2.系统IO与标准IO的区别 I/O 分为标准IO 和系统IO .标准io称为stdio,系统IO又称为文件IO.系统IO是内核提供给用户处理IO操作的接口.例如:标准C是不能处理输入输出问题的.必须借助于内核提供的接口实现对program的输入输出处理.标准I/O 是在系统IO的基

(十一)socket、connect、bind函数详解

一.socket函数 1.头文件: #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> 2.函数原型: int socket(int domain, int type, int protocol); socket函数类似于open,用来打开一个网络连接,如果成功则返回一个网络文件描述符(int类型),之后我们操作这个网络连接都通过这个网络文件描述符. dimain:域,网络域,网络地址范围(IPV4或IPV6

《Javascript高级程序设计》读书笔记之bind函数详解

为什么需要bind var name = "The Window"; var object = { name: "My Object", getNameFunc: function () { return function () { return this.name; } } }; alert(object.getNameFunc()()); //"The Window" object.getNameFunc()返回一个匿名函数,在全局环境调用该

bind函数详解(转)

var name = "The Window"; var object = { name: "My Object", getNameFunc: function () { return function () { return this.name; } } }; alert(object.getNameFunc()()); //"The Window" object.getNameFunc()返回一个匿名函数,在全局环境调用该函数,this指向的

[C] linux静态链接库与动态链接库详解

http://blog.chinaunix.net/u2/76292/showart.php?id=1274181 一顺便说说了哦  通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file).程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下.所以这些函数库被成为静态库(static libaray),通常文件名为"libxx

PHP解压缩文件函数详解

欲使用本函数库需先安装 zlib,可到 http://www.zlib.net/ 取得该函数库. ) zclose: 关闭压缩文件. gzeof: 判断是否在压缩文件尾. gzfile: 读压缩文件到数组中. gzgetc: 读压缩文件中的字符. gzgets: 读压缩文件中的字符串. gzgetss: 读压缩文件中的字符串,并去掉 HTML 指令. gzopen: 打开压缩文件. gzpassthru: 解压缩指针后全部资料. gzputs: 资料写入压缩文件. gzread: 压缩文件读出指

c/c++ socket函数详解

c/c++ socket函数详解 注意: 使用socketAPI前,要先将相关链接库(Ws2_32.lib)加入链接,并使用WSAStartUp函数初始化.每个socket函数都可能失败(返回-1),需要判断结果 socket分成两种: 一种专门用来监听新链接(或新活动),这种socket叫做master socket,一般只存在于服务器 一种专门用来收发数据,这种socket叫做connected socket,客户端和服务器都存在 int socket(int af,int type,int

linux网络编程之shutdown() 与 close()函数详解

linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这个函数会关闭所有和A相关的套接字,包括复制的:而close能直接关闭套接字. 1.close()函数 [cpp] view plain copy print? <span style="font-size:13px;">#include<unistd.h> int