函数适配器 bind1st bind2nd 现在有这么个需求,在遍历容器的时候,希望将容器中的值全部加上 100 之后显示出来,怎么做? 我们直接给函数对象绑定参数 编译阶段就会报错 for_each(v.begin(), v.end(), bind2nd(myprint(),100)); 如果我们想使用绑定适配器,需要我们自己的函数对象继承 cin >> x; for_each(v.begin(), v.end(), bind1st(MyPrint(), x)); //for_each(v.begin(), v.end(), bind2nd ( MyPrint(),x )); } //总结: bind1st 和 bind2nd 区别? //bind1st : 将参数绑定为函数对象的第一个参数 //bind2nd : 将参数绑定为函数对象的第二个参数 //bind1st bind2nd 将二元函数对象转为一元函数对象 class GreaterThenFive
的创建 ; 常用的 " 函数适配器辅助函数 " : bind1st 函数 : 辅助构造 std::binder1st 绑定适配器 实例对象 , 可以 为 二元函数 第一个参数 绑定一个固定的值 ; bind2nd 进行 逻辑取反 操作 ; not2 函数 : 辅助构造 unary_negate 组合适配器 实例对象 , 将 二元谓词 的返回值 , 进行 逻辑取反 操作 ; 二、函数适配器使用示例 - std::bind2nd 函数 1、std::bind2nd 函数原型 std::bind2nd 是一个函数适配器 , 它用于 生成一个新的一元函数对象 , 该对象将给定二元函数对象的第二个参数绑定到一个特定的值 ; std: :bind2nd 函数原型如下 : template <class Operation> binder2nd<Operation> bind2nd(const Operation& op, const 函数适配器更加灵活 , std::bind1st 函数适配器 只能绑定 函数对象 第一个函数参数 ; std::bind2nd 函数适配器 只能绑定 函数对象 第二个函数参数 ; std::bind
v(a, a + 5); cout << count_if(v.begin(), v.end(), is_odd) << endl; //计算奇数元素的个数 // 这里的bind2nd bind2nd(modulus<int>(), 2)) << endl; //bind1st(op, value)(param)相当于op(value, param); cout < 首先,bind2nd 是一个模板函数,如下: // TEMPLATE FUNCTION bind2nd template < class _Fn2, class _Ty > inline 最后总结,也就是count_if 计算容器中为奇数的元素个数,简单地 来说,可以理解成这样:bind2nd(op, value) (param)相当于op(param, value); 其中param 是元素值,value是需要绑定的参数,所谓 bind2nd 也即绑定第二个参数的意思,所以才说 bind2nd将二元函数对象modulus转换为一元函数对象,因为第二个参数就是2,当然 这里的第一个参数就是遍历得到的容器元素值了
(multiplies<int>(), 10) multiplies 函数对象源码如下 : 该函数对象的 重载 函数调用操作符 函数 , 接收 2 个参数 , 使用 bind2nd 函数适配器 为其设置第二个参数为 变换算法中 传入 使用 函数适配器 将预定义二元函数对象转成的 一元函数对象 transform(myVector.begin(), myVector.end(), myVector.begin(), bind2nd 变换算法中 传入 使用 函数适配器 将预定义二元函数对象转成的 一元函数对象 transform(myVector.begin(), myVector.end(), myVector.begin(), bind2nd (multiplies<int>(), 10) multiplies 函数对象源码如下 : 该函数对象的 重载 函数调用操作符 函数 , 接收 2 个参数 , 使用 bind2nd 函数适配器 为其设置第二个参数为 将变换结果 , 输出到 屏幕 标准输出流 中 transform(myVector.begin(), myVector.end(), ostream_iterator<int>(cout, " "), bind2nd
= 2; // 取模运算 , 模 2 返回值 1 就是奇数 , 返回值 0 就是偶数 int count = count_if(myVector.begin(), myVector.end(), bind2nd = 2; // 取模运算 , 模 2 返回值 1 就是奇数 , 返回值 0 就是偶数 int count = count_if(myVector.begin(), myVector.end(), bind2nd 返回值 0 就是偶数 // not1 将其取反 也就是获取的是 非奇数 个数 int count = count_if(myVector.begin(), myVector.end(), not1(bind2nd (modulus<int>(), 2))); 下面的代码中 , modulus 是一个二元函数对象 , 返回 0 或 1 可以当做 二元谓词 ; bind2nd(modulus<int>(), 2) 将 二元谓词 中的 第二个元素进行了绑定 , 只需要接收一个参数 , 变成了 一元谓词 ; not1(bind2nd(modulus<int>(), 2)) 将 上述 一元谓词 取反 , 得到一个新的一元谓词
10.1 函数对象适配器 Bind2nd 是一个函数适配器,可以用来将一个双参函数转换成一个单参函数。使用该适配器可以修改函数中的第二个参数,而将第一个参数保持不变。 bind2nd 适配器的具体用法如下: template <class Operation> typename binder2nd<Operation>::type bind2nd(const Operation bind2nd 会返回一个binder2nd类型的函数对象,它是一个可调用的单参函数对象,可以代替原始的双参函数对象,并将该函数对象的第二个参数固定为arg,从而实现单参数函数的调用。 int num; cin >> num; // 让MyPrint函数绑定num参数,传参是传递到MyPrint中 for_each(var.begin(), var.end(), bind2nd argc, char* argv[]) { vector<int> var = {1,2,3,4,5,6,7,8,9,10}; for_each(var.begin(), var.end(),bind2nd
bind2nd( greater<int>(), 1) 示例 这里的Student沿用前面的定义。 vNum.begin(),vNum.end(),1) << endl; cout << "vNum count_if 1: " << count_if(vNum.begin(), vNum.end(),bind2nd
10.1 函数对象适配器Bind2nd 是一个函数适配器,可以用来将一个双参函数转换成一个单参函数。使用该适配器可以修改函数中的第二个参数,而将第一个参数保持不变。 bind2nd 适配器的具体用法如下:template <class Operation>typename binder2nd<Operation>::typebind2nd(const Operation bind2nd 会返回一个binder2nd类型的函数对象,它是一个可调用的单参函数对象,可以代替原始的双参函数对象,并将该函数对象的第二个参数固定为arg,从而实现单参数函数的调用。 1,2,3,4,5,6,7,8,9,10}; int num; cin >> num; // 让MyPrint函数绑定num参数,传参是传递到MyPrint中 for_each(var.begin(), var.end(), bind2nd int argc, char* argv[]){ vector<int> var = {1,2,3,4,5,6,7,8,9,10}; for_each(var.begin(), var.end(),bind2nd
vector<int, std::alloctor<int>> c {40, 11, 45, 23}; cont << count_if(c.begin(), c.end(), notl(bind2nd
学习实例: STL 仿函数(一) bind函数回调 STL仿函数(二) bind1st,bind2nd 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。
核心是旧版本的bind2nd()和C++11的bind()适配器, 目的是让我们能利用适配器提前指定仿函数的一些参数的数值, 简化自动化的函数调用效果. 理解起来比较简单的bind2nd()是为了实现这个功能首先设计了下面这个辅助的模板函数作为接口: // 使用模板函数作为入口是因为只有模板函数能进行模板实参推导, 核心依然是函数里的模板类 template <class Operation, class T> inline binder2nd<Operation> bind2nd(const Operation& op, const T& x){ 其实现原理更复杂, 但是将原先多个适配器(例如bind1st, bind2nd)整合到一起了, 一个适配器可以实现下面四种功能, 且可以选择要绑定哪些参数, 参数顺序, 参数数量, 返回类型...非常自由
insert("aaa"); set1.insert("bbb"); set1.insert("ccc"); // 判断是不是包含 aaa // 怎么写仿函数,一定要确定好你的仿函数的参数 // bind2nd equal_to 中的 right set<string, greater<string>>::iterator find_it = find_if(set1.begin(), set1.end(),bind2nd count = " << count << endl; // 预定义好的函数对象 + 函数适配器 count = count_if(vector1.begin(), vector1.end(), bind2nd end(), 2); cout << "等于2的个数:" << number << endl; number = count_if(vector1.begin(), vector1.end(), bind2nd (), 2)); cout << "小于2的个数:" << number << endl; number = count_if(vector1.begin(), vector1.end(), bind2nd
cout<<(location_index-data.begin())<<endl; location_index=find_if(data.begin(),data.end(),bind2nd
函数对象的函数适配器:绑定器 bind1st将给定值绑定到二元对象函数第一个实参 bind2nd 第二个实参。
1,2,3,4,5,6,7,8,9,10}; int num; cin >> num; // 让MyPrint函数绑定num参数,传参是传递到MyPrint中 for_each(var.begin(), var.end(), bind2nd argc, char* argv[]) { vector<int> var = {1,2,3,4,5,6,7,8,9,10}; for_each(var.begin(), var.end(),bind2nd
要想找到原因还是看源码,加入如果我们这里写一行代码,find_if(s.begin(),s.end(),bind2nd(func_equal(),temp)),在bind2nd函数里面的参数是const 例如: find_if(coll.begin(), coll.end(), bind2nd(greater <int>(), 42)); 这句话就是找coll中第一个大于42的元素。 greater <int>(),其实就是">"号,是一个2元函数 bind2nd的两个参数,要求一个是2元函数,一个是数值,结果是一个1元函数。 bind2nd就是个函数适配器。
函数对象适配器 //函数适配器bind1st bind2nd //现在我有这个需求 在遍历容器的时候,我希望将容器中的值全部加上100之后显示出来,怎么做? ; cin >> x; for_each(v.begin(), v.end(), bind1st(MyPrint(), x)); //for_each(v.begin(), v.end(), bind2nd ( MyPrint(),x )); } //总结: bind1st和bind2nd区别? //bind1st : 将参数绑定为函数对象的第一个参数 //bind2nd : 将参数绑定为函数对象的第二个参数 //bind1st bind2nd将二元函数对象转为一元函数对象 class GreaterThenFive 10; i++) { v.push_back(i); } // ptr_fun( )把一个普通的函数指针适配成函数对象 for_each(v.begin(), v.end(), bind2nd
C++,并且很方便地实现了委托 这就是传说中的绑定库和增强型的函数对象 接下来一个一个来 Bind 可用于绑定函数、成员函数、函数对象、成员变量 这是老标准中std::bind1st和std::bind2nd
for (int i = 0; i < 10; i++) { v.push_back(i); } for_each(v.begin(), v.end(), bind2nd
=find_last(text,"ll");//crange记录最后的ll的位置 transform( crange.begin(), crange.end(), crange.begin(), bind2nd { cout << copy_range<std::string>(*It) << endl; transform(It->begin(), It->end(), It->begin(), bind2nd