STL 适配器

来源:互联网 发布:程序员交流论坛 编辑:程序博客网 时间:2024/05/22 15:03

适配器的作用: 改变其它STL组件的接口。

 

STL 提供了三种适配器。 容器适配器, 迭代器适配器, 函数适配器。

 

栈stack就是一种适配器

 stack<T>以类型为T的栈,  默认内部是以deque实现。

stack<T, vector<T> > 以类型为T的栈, 内部以vector实现。

strack<T, list<T> >

strack<T, deque<T> >

 

队列queue也是一种适配器

 queue<T>以类型为T的队列,  默认内部是以deque实现。

queue<T, list<T> > 以类型为T的队列, 内部以list实现。

queue<T, deque<T> >

 

priority_queue<T> 以类型为T的队列,  默认内部是以vector实现

priority_queue<T, vector<T> >

priority_queue<T, deque<T> >

 

这些容器适配器, 你想要什么样的实现, 可以轻易实现很容易使用。

 

迭代器适配器: 反向迭代器就是一种适配器。

反向迭代器对在迭代器上的操作进行了重新的定义,使其完成相反的操作。

 

函数适配器有三种。

绑定器bind 取反器negator 函数指针适配器, 这些适配器是以类模板的形式定义。

 

绑定器有2个

bind1st: 把指定值绑定到第一个参数上。

 bind2nd: 把指定的值绑定到第二个参数上。

template <class _Tp>
struct greater : public binary_function<_Tp, _Tp, bool> {
  bool operator()(const _Tp& __x, const _Tp& __y) const { return __x > __y; }
};

 

example:

 int *where = find_if(&array[0], &array[10], bind1st(greater<int>(), 200));

这句的意思就是把200绑定到第一个参数上,也就是绑定到x上。 所以就变成了 return 200 > y; 这样当y是小于等于200的的数变就会返回真。

所以查找的是第一个小于等于200的数。

 int *where = find_if(&array[0], &array[10], bind2nd(greater<int>(), 200));

这个和上面一句相反返回的是第一个大于200的数。

 

取反器:

not1: 对一元判断函数对像取反。

not2: 对二元判断函数对像取反。

 

函数指针适配器:

 目的是为了一元和二元函数的指针能与STL的其它函数适配器一起工作。

examlpe:

假如程序要使用:

set<string, less<string> >set1;

set<string, greater<string> >set2;

使用函数指针的话:

bool less1(const string& x, const sting& y) { return x < y; }

bool greater(const string& x, const string& y) { return x > y; }

typedef set<string, pointer_to_binary_function<const string&,  const string&, bool> >  set_type;

set_type set1(ptr_fun(less1));

set_type set2(ptr_fun(greater));

这样可以减少代码。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击