当前位置:首页 > > 充电吧
[导读]STL适配器,所谓适配器在设计模式中也有相应的讲解即,在不改变原有接口的前提下,将该接口转换为我们期待的接口,通常要求的接口和被适配的接口会有相同或者相似的功能,分为三者,Target(客户要求的接口

STL适配器,所谓适配器在设计模式中也有相应的讲解即,在不改变原有接口的前提下,将该接口转换为我们期待的接口,通常要求的接口和被适配的接口会有相同或者相似的功能,分为三者,Target(客户要求的接口) adaptee:(原有的接口,被适配的接口)  adapter(适配器接口),adapter是共有继承了Target,成员变量获得adaptee的指针来实现的!!!


,适配器模式,分为两种一种是对象适配器模式,一种是类适配器模式,STL适配器有三种,一种是迭代器适配器,一种是函数适配器,最后一种则是容器适配器:

所谓适配器说的简单些,其根本就是类型转换器其较简单的讲解就是原本是向前的操作,转换之后变成了向后的操作。我们采用原本是iterator适配器,我们从容器中从前向后进行遍历,而反向迭代器则是从最后元素开始遍历,其下一个则是向前移动的。我们将原有的迭代器进行封装,其C++代码如下:


templateclass TVector_iterator;
templateclass Iterator_m
{
public:
	virtual T*First() = 0;	
	virtual T*Next() = 0;	
	virtual bool isDone() = 0;
};
templateclass TVector
{
private:
	T* m_list;
	int m_cur_num;
	int m_max_num;
public:
	TVector()
	{
		m_list = NULL;
		m_max_num = 24;
		m_list = new T[m_max_num];
		m_cur_num = 0;
	}
	int get_num()
	{
		return m_cur_num;
	}
	T* First()
	{
		return m_list;
	}
	TVector_iterator* create_iterator()
	{
		return new TVector_iterator(this);
	}
	void append(T m)
	{
		if (m_cur_num == m_max_num)
		{
			T* new_list = new T[m_max_num * 2];
			for (int i = 0; i < m_max_num; i++)
			{
				new_list[i] = m_list[i];
			}
			delete m_list;
			m_list = new_list;
		}
		m_list[m_cur_num++] = m;
	}
};
templateclass TVector_iterator :public Iterator_m{
private :
	TVector* m_hinstance;
	int m_cur_pos;
	T* m_head;
public:
	TVector_iterator(TVector* m)
	{
		m_hinstance = m;
		m_cur_pos = 0;
		m_head = m_hinstance->First();
	}
	T* First()
	{
		m_cur_pos = 0;
		return m_head=m_hinstance->First();
	}
	T* Next()
	{
		return &m_head[m_cur_pos++];
	}
	T* Prev()
	{
		return &m_head[m_cur_pos--];
	}
	T* Last()
	{
		m_cur_pos = m_hinstance->get_num() - 1;
		m_head = m_hinstance->First();
		return &m_head[m_cur_pos];
	}
	int get_cur_pos()
	{
		return m_cur_pos;
	}
	bool isDone()
	{
		if (m_cur_pos == m_hinstance->get_num())
		{
			return true;
		}
		return false;
	}
};
templateclass reverse_iterator_m :public Iterator_m{
private:
	TVector_iterator* m_iterator;
public:
	T* First()
	{
		return m_iterator->Last();
	}
	T* Next()
	{
		return m_iterator->Prev();

	}
	reverse_iterator_m(TVector_iterator* m)
	{
		m_iterator = m;
		m_iterator->First();
	}
	bool isDone()
	{
		if (m_iterator->get_cur_pos() == -1)
		{
			return true;
		}
		return false;
	}

};
int main()
{
	TVectormm;
	for (int i = 0; i < 20; i++)
	{
		mm.append(i);
	}
	TVector_iterator* itr = mm.create_iterator();
	cout << "这是使用Iterator 的结果n";
	while (!itr->isDone())
	{
		cout << *(itr->Next()) << endl;	
	}
	reverse_iterator_m* ritr = new reverse_iterator_m(itr);
	cout << "这是使用reverse_Iterator 的结果n";
	ritr->First();
	while (!ritr->isDone())
	{
		cout << *(ritr->Next()) << endl;
	}
}

接下来要讨论的就是函数适配器,所谓函数适配器,也即函数的类型转换,比如大家最常用的例子是find_if,find_if的第三个参数是需要接受一个一元函数,然而我们真的需要的是动态获取find_if中的first到last中的数据,另一个参数则是确定的值,这时候,就会需要进行函数的转换,也即函数适配器:其C++代码实现下所示:


#include#includeusing namespace std;



templatestruct get_equal :public binary_function{
	bool operator()(T m, T n)
	{
		return m == n;
	}
};

templateclass bind_1St_cla :public unary_function{
protected:
	Fn op;//保存函数对象
	typename Fn::first_argument_type value;//根据函数第一参数的类型,声明变量,将值保存,以后不变,也即进行了绑定
public:
	//这里面需要做的两个,一个是构造函数,对op 和value进行赋值
	bind_1St_cla(const Fn& m, typename Fn::first_argument_type n) :op(m), value(n)
	{}
	//第二个是重载()操作符
	typename Fn::result_type operator()(const typename Fn::second_argument_type m)
	{
		return op(value, m);
	}
};
//接下来是定义一个内联函数,对类bind_1St_cla进行使用
templateinline /*标志常驻内存,提高速度*/ bind_1St_clathe_real_fuction(const Fn& m, const Ty ha)
{
	return bind_1St_cla(m, ha);
}


int main()
{
	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
	int* mm = find_if(a, a + 8, the_real_fuction(get_equal(), 4));
	cout << *mm << endl;
}





本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭