stl仿函数和适配器

所谓的适配器就是底层利用仿函数,然后修改仿函数的接口,达到自己的目的;

例如:template<class operation>

class binder1st的适配器,其本质是一个类,它的模板参数operation其实是仿函数类(仿函数其实是struct类),内部函数调用operator()(const typename Operation::second_argument_type& x) const,其中x是我们适配器调用的参数,由于此适配器的目的就是绑定第一个参数,使得我们的调用只需要一个参数x(第二个参数);

我们可以生成一个class binder1st的对象,例如

typename less<int>::first_argument_type   Arg1_type;

Arg1_type s1=Arg1_type(5);//初始化为对象

binder1st<less<int>> mybinder1st(less<int>(),s1);

然后调用mybinder1st(x)   //typename Operation::second_argument_type  x

然而这样会很繁琐,所以stl提供了适配器函数解决问题,适配器函数返回的是适配器对象

template <class Operation, class T>

inline binder1st<Operation> bind1st(const Operation& op, const T& x) {

  typedef typename Operation::first_argument_type arg1_type;

  return binder1st<Operation>(op, arg1_type(x));//返回对象

}

使用规则如下:

bind1st( less<int>(), 10)(20);

其实分为两步:

1.首先调用bind1st函数,这个函数需要两个参数bind1st(less<int>(),10),返回的是binder1st类的对象,然后调用此临时对象的operator()函数,此函数只需要一个参数,传递为20,同时binder1st类的成员函数operator()函数内部,调用的是仿函数的operator(10,20)

本质的内容就是绑定一个参数,另外一个参数用作参数使用,这样就可以完成适配,成为一个参数的调用过程

template <class Operation> 

class binder1st

  : public unary_function<typename Operation::second_argument_type,

                          typename Operation::result_type> {

protected:

  Operation op;  //以要适配的仿函数为成员变量

  typename Operation::first_argument_type value; //第一个参数

public:

  binder1st(const Operation& x,

            const typename Operation::first_argument_type& y)

      : op(x), value(y) {} //构造函数里对两个成员变量赋值

  typename Operation::result_type

  operator()(const typename Operation::second_argument_type& x) const {

    return op(value, x); //重载并接受第二个参数,以完成适配

  }

};
时间: 2024-10-26 16:23:14

stl仿函数和适配器的相关文章

[GeekBand] STL 仿函数入门详解

本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) page 37 :网络资料: 叶卡同学的部落格  http://www.leavesite.com/ 前言:本文主要通过关联容器set解释下仿函数的实现及工作原理. 一.STL六大组件简介 1.Containers(容器):各种数据结构,如Vector,List,Deque,Set,Map,用来存放数据2.Algorithms(算法):如. Sort,Search.3.Iterators(

STL之容器适配器priority_queue的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 在前面的文章STL之heap相关操作算法中介绍了堆的相关操作算法,由于堆的注意主要作用是用于排序,我们也知道堆排序的时间复杂度为o(nlogn),是一种不稳定的排序算法,利用堆这一数据结构,我们可以很快第获取一个大数据中最大(或最小)的k个数.同时,上篇文章中,也提出了相关heap算法的一些问题. 问题1:在调用push_heap函数实现向堆中插入元素之前,我们必须要先将向底层容器的末端插入该元素,然后才能调用push_heap内部的向上调整来

STL之stack适配器的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 一提到适配器(adapter),我们就想到了早期用电话线上网所用的调制解调器,俗称"猫","猫"的作用是实现数模转化和模数转化,在客户端,它可以将电话的模拟信息转化为我们计算机能够接收的数字信息,所以猫相当于一个转换器.再举个更加好理解的例子来说明"适配器"的含义.相信在我们每个人的家里都有插排,假设就这么一种情况,现在我们家里的墙壁上只有一个三角的插口,而我们的电视却是两个口,怎么办?毫无疑问

STL 之 空间适配器

1.sgi STL"标准"的空间适配器: 该适配器很简单,只是对new delete等内存分配释放函数的一层简单封装而已,所以sgi stl几乎没用上它(效率太低),代码位于defalloc.h. 2.sgi stl特殊适配器 std::alloc: 该版本作为stl中的默认适配器,主要分成两个部分: #include <stl_alloc.h>          //空间配置与释放 #include <stl_construct.h>   //空间内对象的构造

STL之容器适配器queue的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 上篇文章STL之容器适配器stack的实现框架已经介绍了STL是如何借助基础容器实现一种常用的数据结构stack (栈),本文介绍下另外一种STL内部定义的另外一种STL容器适配器queue(队列). 对于接触过数据结构的人来说,队列并不陌生,它是一种FIFO(first in first out)的数据结构.与栈相比,队列的不同之处在于:(1)队列是一种先进先出的数据结构,而栈则是一种后进先出的数据结构:(2)队列支持首尾两端的访问操作,而栈

初探STL之容器适配器

容器适配器 特点 用某种顺序容器来实现(让已有的顺序容器以栈/队列的方式工作) 分类 1) stack: 头文件 <stack> ? 栈 -- 后进先出 2) queue: 头文件 <queue> ? 队列 -- 先进先出 3) priority_queue: 头文件 <queue> ? 优先级队列 -- 最高优先级元素总是第一个出列 注: 容器适配器上没有迭代器 STL中各种排序, 查找, 变序等算法都不适合容器适配器 Stack 特点 1.stack 是后进先出的数

STL之容器适配器stack的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 一提到适配器(adapter).我们就想到了早期用电话线上网所用的调制解调器,俗称"猫"."猫"的作用是实现数模转化和模数转化,在client,它能够将电话的模拟信息转化为我们计算机能够接收的数字信息,所以猫相当于一个转换器.再举个更加好理解的样例来说明"适配器"的含义.相信在我们每一个人的家里都有插排,如果就这么一种情况.如今我们家里的墙壁上仅仅有一个三角的插口,而我们的电视却是两个口,怎么办

STL容器及适配器

STL容器   1.序列式容器 : vector,deque,list. 每个元素都有固定的位置(取决于插入的时机和位置,与元素值无关). vector 特点: 将一个元素置于一个动态数组中加以管理,可以随机存取元素.在数组尾部添加或删除元素非常快速,但是在中部或头部插入或删除元素比较耗时. deque "double-ended queue" 双端队列,可以随机存取.数组尾部或头部添加或删除元素非常快速,但在中部插入或删除元素比较费时.实际上,deque 是对vector 和list

初步STL该容器适配器

容器适配器 特点 容器一定的顺序来实现(让现有的以集装箱堆放/式工作) 分类 1) stack: 头文件 <stack> ? 栈 -- 后进先出 2) queue: 头文件 <queue> ? 队列 -- 先进先出 3) priority_queue: 头文件 <queue> ? 优先级队列 -- 最高优先级元素总是第一个出列 注: 容器适配器上没有迭代器 STL中各种排序, 查找, 变序等算法都不适合容器适配器 Stack 特点 1.stack 是后进先出的数据结构