欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STL源码剖析 8、配接器

程序员文章站 2024-02-11 20:52:28
...

概念

将一个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());}

●注意:
STL源码剖析 8、配接器
●编写
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

仿函数配接器

predicate是谓词的意思

仿函数配接器表格见8.4

bind1st和bind2nd:将二元函数转换为一元函数
●使用:
STL源码剖析 8、配接器
not1(一元),not2(二元):对返回值进行逻辑否定
●使用:不小于12的元素个数:not1(bind2nd(less<int>(), 12))
●代码:
STL源码剖析 8、配接器

compose1,compose2:用于函数合成
●使用:数学表达式f(g(elem))写成compose1(f(x), g(y));
●代码:
STL源码剖析 8、配接器

ptr_fun:用于函数指针,将一般函数(无配接能力)当成仿函数传给STL算法,使其获得配接能力
●代码:
STL源码剖析 8、配接器

mem_fun,mem_fun_ref:用于成员函数指针
●使用:
STL源码剖析 8、配接器

相关标签: STL源码剖析