【C++】STL 算法 ⑩ ( 函数适配器 | 函数适配器概念 | 函数适配器分类 | 函数适配器辅助函数 | std::bind2nd 函数原型及示例 | std::bind 函数原型及示例 )

这篇具有很好参考价值的文章主要介绍了【C++】STL 算法 ⑩ ( 函数适配器 | 函数适配器概念 | 函数适配器分类 | 函数适配器辅助函数 | std::bind2nd 函数原型及示例 | std::bind 函数原型及示例 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。





一、函数适配器简介



1、函数适配器概念


在 STL 中 预定义了很多 函数对象 , 如果要 对 函数对象 的 参数 / 返回值 进行 计算 或 设置 , 可以 使用 " 函数适配器 " 实现上述需求 ;

" 函数适配器 " 可以 将 已存在的 函数对象 转化为 另一种符合要求的 函数对象 ;

" 函数适配器 " 定义在 <functional> 头文件 中 ;


2、函数适配器分类


" 函数适配器 " 常用类型的两类 :

  • 绑定适配器 :
    • std::bind 绑定适配器 : 引入的一个 通用绑定机制 , 可 绑定 函数 / 函数指针 / 函数对象 / 成员函数指针 任意 位置 的 参数 到指定的值 , 也可以重新排列参数的顺序 , 或者将多个可调用对象组合在一起 ; C++ 11 最新引入的 , 建议使用 该 绑定适配器 ;
    • std::binder1st 绑定适配器 : 将一个二元函数对象的 第一个 参数 绑定到一个特定的值 , 从而创建一个新的一元函数对象 ; C++ 11 弃用 , 建议使用 std::bind 绑定适配器 ;
    • std::binder2nd 绑定适配器 : 将一个二元函数对象的 第二个 参数 绑定到一个特定的值 , 从而创建一个新的一元函数对象 ; C++ 11 弃用 , 建议使用 std::bind 绑定适配器 ;
  • 组合适配器 :
    • unary_negate 组合适配器 : 将 一元谓词 的返回值 , 进行 逻辑取反 操作 , 得到一个新的 bool 类型 布尔值 ;
    • binary_negate 组合适配器 : 将 二元谓词 的返回值 , 进行 逻辑取反 操作 , 得到一个新的 bool 类型 布尔值 ;

3、函数适配器辅助函数


函数适配器 的 创建构造 需要很复杂的类型声明 , 为了方便开发 , C++ 的 STL 标准模板库 中提供了 " 函数适配器辅助函数 " , 可以 无需显示声明类型 , 就可以 实现 函数适配器 的创建 ;


常用的 " 函数适配器辅助函数 " :

  • bind1st 函数 : 辅助构造 std::binder1st 绑定适配器 实例对象 , 可以 为 二元函数 第一个参数 绑定一个固定的值 ;
  • bind2nd 函数 : 辅助构造 std::binder2nd 绑定适配器 实例对象 , 可以 为 二元函数 第二个参数 绑定一个固定的值 ;
  • not1 函数 : 辅助构造 unary_negate 组合适配器 实例对象 , 将 一元谓词 的返回值 , 进行 逻辑取反 操作 ;
  • not2 函数 : 辅助构造 unary_negate 组合适配器 实例对象 , 将 二元谓词 的返回值 , 进行 逻辑取反 操作 ;




二、函数适配器使用示例 - std::bind2nd 函数



1、std::bind2nd 函数原型


std::bind2nd 是一个函数适配器 , 它用于 生成一个新的一元函数对象 , 该对象将给定二元函数对象的第二个参数绑定到一个特定的值 ;


std::bind2nd 函数原型如下 :

template <class Operation>  
binder2nd<Operation> bind2nd(const Operation& op, const typename Operation::second_argument_type& value);
  • 参数解析 :

    • Operation &op 参数 : 该参数是 要绑定的二元函数对象 , 它必须定义 second_argument_type 作为其第二个参数的类型 , 也就是说 第二个参数类型 需要 与 本函数的 value 值类型相同 ;
    • value 参数 : 该参数是 要绑定到二元函数对象第二个参数的 值 或 变量 ;
  • 返回值解析 : 返回一个 binder2nd 类 的对象 , 该对象是一个一元函数对象 , 可以像普通函数对象一样被调用 ;


2、代码示例 - std::bind2nd 函数


代码示例 :

#include "iostream"
using namespace std;
#include <vector>
#include <algorithm>
#include "functional"

int main() {

	// 创建一个 set 集合容器
	vector<int> myVector;

	// 向容器中插入元素
	myVector.push_back(9);
	myVector.push_back(5);
	myVector.push_back(2);
	myVector.push_back(7);
	myVector.push_back(2);

	// 向 foreach 循环中传入 Lambda 表达式
	for_each(myVector.begin(), myVector.end(), [](int a) {
		std::cout << a << " ";
		});
	cout << endl;

	// 计算 vector 容器中 , 值为 2 的个数
	int equal_num = 2;
	int count = count_if(myVector.begin(), myVector.end(), bind2nd(equal_to<int>(), equal_num));
	cout << "值为 2 的元素个数 : " << count << endl;

	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

执行结果 :

9 5 2 7 2
值为 2 的元素个数 : 2
Press any key to continue . . .

【C++】STL 算法 ⑩ ( 函数适配器 | 函数适配器概念 | 函数适配器分类 | 函数适配器辅助函数 | std::bind2nd 函数原型及示例 | std::bind 函数原型及示例 ),C++,c++,算法,开发语言,STL,函数适配器,函数适配器辅助函数,函数适配器分类





三、函数适配器使用示例 - std::bind 函数



1、std::bind 函数原型


std::bind 函数适配器 是 C++11 新引入的 函数适配器 , 可以 将 函数 / 函数对象 / 函数指针 与 其参数绑定到一起 , 产生一个新的可调用函数对象 ;

std::bind 函数适配器 比 std::bind1st 和 std::bind2nd 函数适配器更加灵活 ,

  • std::bind1st 函数适配器 只能绑定 函数对象 第一个函数参数 ;
  • std::bind2nd 函数适配器 只能绑定 函数对象 第二个函数参数 ;
  • std::bind 函数适配器 不仅能绑定 第一第二个函数参数 , 还能绑定第三个第四个直至第 N 个函数参数 , 没有任何位置限制 ;

std::bind 函数原型如下 :

template< class Fn, class... Args >  
/*unspecified*/ bind( Fn&& fn, Args&&... args );
  • 参数解析 :

    • Fn&& fn 参数 : fn 是一个可调用对象 , 可以是 函数 / 函数指针 / 成员函数 / 成员函数指针 / 函数对象 / 谓词 等可调用对象 ;
    • Args&&… args 参数 : 这是一个可变的参数 , 参数可以是值 , 引用 或者 占位符 ;
  • 返回值解析 : 返回的是一个未指定的类型 , 这个类型是一个函数对象 , 可以像普通函数那样被调用 ; 当返回的函数对象被调用时 , 它会用提供的参数和 std::bind 中的占位符来调用 fn ;


占位符 是 std::placeholders::_1 , std::placeholders::_2 等值 ;

如果 参数中是 std::placeholders::_1 占位符 , 表示 第一个 参数 , 不进行修改 , 仍然保持其默认值 ; std::placeholders::_2 占位符 , 表示 第二个 参数 , 不进行修改 , 仍然保持其默认值 ;


2、代码示例 - std::bind 函数


代码示例 :

#include "iostream"
using namespace std;
#include <vector>
#include <algorithm>
#include "functional"

int main() {

	// 创建一个 set 集合容器
	vector<int> myVector;

	// 向容器中插入元素
	myVector.push_back(9);
	myVector.push_back(5);
	myVector.push_back(2);
	myVector.push_back(7);
	myVector.push_back(2);

	// 向 foreach 循环中传入 Lambda 表达式
	for_each(myVector.begin(), myVector.end(), [](int a) {
		std::cout << a << " ";
		});
	cout << endl;

	// 计算 vector 容器中 , 值为 2 的个数
	int equal_num = 2;
	int count = count_if(myVector.begin(), myVector.end(), bind(equal_to<int>(), placeholders::_1, equal_num));
	cout << "值为 2 的元素个数 : " << count << endl;

	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

执行结果 :

9 5 2 7 2
值为 2 的元素个数 : 2
Press any key to continue . . .

【C++】STL 算法 ⑩ ( 函数适配器 | 函数适配器概念 | 函数适配器分类 | 函数适配器辅助函数 | std::bind2nd 函数原型及示例 | std::bind 函数原型及示例 ),C++,c++,算法,开发语言,STL,函数适配器,函数适配器辅助函数,函数适配器分类文章来源地址https://www.toymoban.com/news/detail-786211.html

到了这里,关于【C++】STL 算法 ⑩ ( 函数适配器 | 函数适配器概念 | 函数适配器分类 | 函数适配器辅助函数 | std::bind2nd 函数原型及示例 | std::bind 函数原型及示例 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ [STL容器适配器]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT 前面我们介绍了适配器模式中的反向迭代器,反向迭代器通过容器所支持的正向迭代器适配为具有反向迭代功能的迭代器,本节我们介绍STL中另一种适配器: 容器适配器 ! 前面我们提到过STL适配器模式,关于适配器的解释: S

    2024年02月11日
    浏览(32)
  • C++ STL学习之【容器适配器】

    ✨个人主页: 北 海 🎉所属专栏: C++修行之路 🎊每篇一句: 图片来源 A year from now you may wish you had started today. 明年今日,你会希望此时此刻的自己已经开始行动了。 适配器(配接器)是 STL 中的六大组件之一,扮演着轴承、转换器的角色,使得 STL 中组件的使用更为灵活,

    2023年04月22日
    浏览(47)
  • 【C++】STL之容器适配器——使用deque适配stack和queue

    个人主页:🍝在肯德基吃麻辣烫 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处。 本文章主要介绍容器适配器的功能,以及一个适配的场景。 容器适配器,按字面意思理解的话,就是用来对一个容器进行匹配的。在C++STL中,容器有:vector,list,deque,map,set等。

    2024年02月16日
    浏览(42)
  • STL:双端队列&容器适配器&仿函数&优先级队列

    双端队列可以在头部和尾部进行插入删除操作 与vector相比,头插效率高,不需要搬移元素 与list相比,空间利用率高 deque逻辑上空间是连续的,物理上并不是,是由一段段小空间拼接而成的 双端队列的迭代器比较复杂 cur:指向空间中被遍历的那个元素 first:指向空间开始

    2024年02月16日
    浏览(31)
  • STL容器适配器 -- stack和queue(使用+实现)(C++)

    栈和队列数据结构+画图分析如果对栈和队列的结构不了解的,可以先看该链接的内容 使用stack时需要头文件 #includestack stack是一种容器适配器,用于具有 后进先出 (LIFO)的环境中。只能从容器的一端(栈顶),执行删除、插入和提取操作。 stack是作为容器适配器实现的,容器

    2024年02月14日
    浏览(47)
  • 【C++】STL之适配器---用deque实现栈和队列

    目录 前言 一、deque  1、deque 的原理介绍  2、deque 的底层结构  3、deque 的迭代器  4、deque 的优缺点   4.1、优点   4.2、缺点 二、stack 的介绍和使用  1、stack 的介绍  2、stack 的使用  3、stack 的模拟实现 三、queue 的介绍和使用  1、queue 的介绍   2、queue 的使用  3、queue 的模

    2024年02月07日
    浏览(38)
  • 【C++】STL——反向迭代器的模拟实现:迭代器适配器

    反向迭代器的使用相信大家都已经比较熟悉了,那我们这篇文章具体讲什么呢? 🆗,这篇文章我们重点来讲一下 反向迭代器的模拟实现 。 那为什么我们之前不和正向迭代器放在一块讲呢?为什么要等到我们讲完了容器适配器再来讲反向迭代器的模拟实现呢? 那这个问题我

    2024年02月08日
    浏览(33)
  • 【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL)

    文章绑定了VS平台下std::stack和std::queue的源码,大家可以下载了解一下😍 前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数也认识了什么是类和对象以及怎么去new一个 ‘对象

    2024年02月12日
    浏览(32)
  • C++、STL标准模板库和泛型编程 ——适配器、补充(侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C++ 面向对象高级开发 1、C++面向对象高级编程(上) 2、C++面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C++ 设计模式 四、C++ 新标准 五、

    2023年04月27日
    浏览(59)
  • 【C++】STL反向迭代器模拟实现,迭代器适配器,迭代器类型简单介绍

    本篇主要讲反向迭代器的模拟实现。 能够加深各位对泛型的理解。 前面我那篇string介绍里面已经提到过反向迭代器是啥了,如果点进来的同学还不知道,可以看看:[string介绍](https://blog.csdn.net/m0_62782700/article/details/130796914? spm=1001.2014.3001.5501) 迭代器,可以在不暴露底层实现细

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包