【C++学习笔记(四十)】之STL中适配器的介绍

本文章由公号【开发小鸽】发布!欢迎关注!!!


老规矩–妹妹镇楼:

一. 适配器

       我们都知道,笔记本电脑的转接头适配器能够扩展缺少的接口,STL中的适配器也是一样的效果,它能够将某些类型扩展接口,适配到其他类型中。即扩展参数的个数,如将一元函数扩展为二元函数…

       需要引入头文件

#include<functional>

二.仿函数 适配器扩展参数到二元

(一)应用场景:


       本为一元仿函数MyPoint(),需要将用户输入的num适配到原有的MyPoint()仿函数中,因此用适配器将MyPoint()仿函数适配为二元仿函数。

(二)步骤


       第一步绑定数据 bind2nd,意思是绑定数据num到第二个参数start上; 绑定数据bind1st,将数据num绑定到第一个参数v上

       第二步仿函数的类继承 binary_function<参数类型1, 参数类型2,返回值类型>

       第三步:加const限定 operator(),不允许修改

class MyPoint : public binary_function<int, int, void>
{
public:
	void operator() (int v, int start) const
	{
		cout << v + start << endl;
	}
}	

void test()
{
	vector<int> v;
	for(int i = 0 ; i < 10; ++i)
	{	
		v.push_back(i);
	}
	int num;
	cin >> num;
	for_each(v.begin(), v.end(), bind2nd(MyPoint(), num) );
}

三.取反适配器

       not1对一元函数对象取反,not2对二元函数对象取反

(一)步骤

       继承 unary_function<参数类型1,返回值类型>,限制const

(二)场景:

       在vector中寻找大于5的第一个数字,后更改需求,寻找小于5的第一个数字,将该一元仿函数转换成相反的功能。not1适配器,实现相反功能

class GreaterThanFive : public unary_function<int, bool>
{
public:
	bool operator() (int v)	const
	{
		return v > 5;
	}
}

void test()
{
	vector<int> v;
	for(int i = 0; i < 10; ++i)
	{
		v.push_back(i);
	}

	vector<int> iterator pos = find_if(v.begin(), v.end(), not1(GreaterThanFive()) );
	if( pos != v.end())
	{
		cout << “找到小于5的数字为:” << *pos << endl;
	}
	else
	{
		cout <<”未找到” << endl;
	}
}

四.普通函数指针适配器 ptr_fun

       普通函数指针不像前面说的仿函数是个类能够继承,我们需要将普通函数指针适配为函数对象(仿函数),用ptr_fun(普通函数指针)适配成了函数对象,也能够向前面一样扩展接口参数。但不需要继承,以及限制const

void MyPrint(int v, int start)
{
	cout << v +start <<endl;
}

void test()
{
	vector<int> v;
	for(int i = 0; i < 10; ++i)
	{
		v.push_back(i);
	}
	int num;
	cin >> num;
	for_each(v.begin(), v.end(), bind2nd(ptr_fun(MyPoint), num ) );
}

五.成员函数适配器 mem_fun_ref / mem_fun


       针对类中的内容,我们之前对类中的内容进行排序时,设置一个全局回调函数,调用回调函数。因为是对同一个类的内容进行处理,那么用类中的成员函数不是更好么?

       因此,可以用成员函数适配器mem_fun_ref将类中的成员函数适配成回调函数。

两种形式:

       1. 当vector v; vector中存储的是Person对象时,用mem_fun_ref适配器

 mem_fun_ref( &Person::showPerson)`	

       将Person类中的showPerson()成员函数配置成回调函数,注意括号内为Person类的showPerson的成员函数的地址。

       2. 当vector<Person *> v; vector中存储的是Person的对象指针时,使用mem_fun适配器

mem_fun(&Person::showPerson));

class Person
{
public:
	Person(string name, int age)
	{
		this->m_Name = name;
		This->m_Age = age;
	}

	void showPerson()
	{
		cout << “姓名:” << m_Name <<” 年龄:“ << m_Age <<endl;
	}

	string m_Name;
	int m_Age;
}

void test()
{
	vector<Person> v;
	Person p1(1, 1);
	Person p2(2, 2);
	v.push_back(p1);
	v.push_back(p2);

	for_each(v.begin(), v.end(), mem_fun_ref(&Person::showPerson));
}

以上就是STL中适配器的简单介绍,初次学习,请多关照!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值