STL源码剖析 8、配接器

概念

将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作

分类

●仿函数配接器:数量最多,有bind、negate、compose等。
 本身要可配接才能获得配接能力,一元函数继承自unary_function、二元…、成员函数以mem_fun处理、一般函数以ptr_fun处理(成员函数和一般函数没有operator())
●容器配接器:stack和queue内部是deque实现
●迭代器配接器:insert iterators,reverse iterators,iostream iterators

规律

容器配接器类内含一个容器成员。
reverse iterator配接器类内含一个迭代器(正序)。
insert iterator配接器内含容器指针(方便插入)。
stream iterator 迭代器内含stream指针。
仿函数配接器内含一个可配接的仿函数的对象Operation op;

容器配接器

stack和queue

template<class T, class Sequence = deque<T>>
class stack{	//queue就是把stack改成queue
	protected: Sequence c;	//底层容器
	>>>
}

迭代器配接器

insert iterators
●编写
1、内部维护容器Container *container;
2、“operator =”变成插入

back_insert_iterator<Container>&	
operator=(const typename Container::value_type& value){
	container->push_back(value);
	return *this;
}

3、*、前置/后置++不起作用(没有意义),即函数体内只有一句return *this;
4、辅助函数

template<class Container>
inline back_insert_iterator<Container>back_inserter(Container& x){
	return back_insert_iterator<Container>(x);	
}

●应用

int ia[] = {0, 1, 2, 3, 4, 5};
deque<int>id(ia, ia + 6);
//将copy中的=操作变为push_back,front则变为push_front
copy(ia + 1, ia + 2, back_inserter(id));

reverse iterators
●应用

//vector和list中
reverse_iterator rbegin()	{return reverse_iterator(end());}
reverse_iterator rend()		{return reverse_iterator(begin());}

●注意:
在这里插入图片描述
●编写
1.类内部维护对应的正向迭代器Iterator current;
2.逆向迭代器的相应型别和对应的正向迭代器相同

typedef typename Iterator_traits<Iterator>::iterator_categoty iterator_categoty;
...

3.重载operator*,对逆向取值就是将正向后退一格取值

reference operator*() const{
	Iterator tmp = current;
	return *--tmp;		//关键
}

4.逆转+和-,+=和-=, ++和–

self& operator++(){
	--current;
	return *this;
}
...

stream iterators见书8.3.3

仿函数配接器

如何调用operator=?辅助函数创建对象,用对象调用仿函数,如pred(*first)

predicate是谓词的意思

仿函数配接器表格见8.4

bind1st和bind2nd:将二元函数转换为一元函数
●使用:
在这里插入图片描述
not1(一元),not2(二元):对返回值进行逻辑否定
●使用:不小于12的元素个数:not1(bind2nd(less<int>(), 12))
●代码:
在这里插入图片描述

compose1,compose2:用于函数合成
●使用:数学表达式f(g(elem))写成compose1(f(x), g(y));
●代码:
在这里插入图片描述

ptr_fun:用于函数指针,将一般函数(无配接能力)当成仿函数传给STL算法,使其获得配接能力
●代码:
在这里插入图片描述

mem_fun,mem_fun_ref:用于成员函数指针
●使用:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值