前文:《Essential C++》笔记之设计一个泛型算法(一)

相关博文:C++头文件<functional>和bind、placeholders占位符使用简单例子
相关博文:《Essential C++》笔记之设计一个泛型算法(二)
相关博文:C++Function Object Adapter之not1
相关博文:C++之再探参数绑定bind、bind1st、bind2nd、placeholders占位符
相关博文:C++新特性探究(十五):bind

  任务4:使用Function Object令call运算符成为inline,从而消除“通过函数指针来调用函数”时付出的额外代价。使用Function Object Adapter消除元素类型、容器类型间的依赖性。

Function Object介绍:

——《Essential C++》中文版 Page 85

Function Object Adapter介绍:

——《Essential C++》中文版 Page 87

  为了消除filter()和元素类型间的依赖性,将filter()改为function template,并将元素类型加入template的声明中。为了消除filter()和容器类型间的依赖性,传入一对iterator[first,last),并在参数列表中增加另一个iterator,用以指定从何处开始复制元素。这里写一段小程序,测试其在array和vector上的使用,我们各需两种容器的两份实例:其中之一储存即将被过滤(filter)的元素,另一个用来储存过滤后的元素,并令后者的容量与前者相同:

//小问学编程
#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
using namespace std;template<typename InputIterator,typename OutputIterator,typename ElemType,typename Comp>
OutputIterator filter(InputIterator first,InputIterator last,OutputIterator at,const ElemType &val,Comp pred);int main()
{const int elem_size=8;int ia[elem_size]={12,8,43,0,6,21,3,7};vector<int> ivec(ia,ia+elem_size);//下面这个容器用来储存过滤结果int ia2[elem_size];vector<int> ivec2(elem_size);cout<<"filtering integer vector for values less than 8\n";filter(ia,ia+elem_size,ia2,elem_size,less<int>());cout<<"filtering integer vector for value greater than 8\n";filter(ivec.begin(),ivec.end(),ivec2.begin(),elem_size,greater<int>());
}template<typename InputIterator,typename OutputIterator,typename ElemType,typename Comp>
OutputIterator filter(InputIterator first,InputIterator last,OutputIterator at,const ElemType &val,Comp pred)
{while((first=find_if(first,last,bind2nd(pred,val)))!=last){//观察进行情形cout<<"found value:"<<*first<<endl;//执行assign操作,然后令两个iterator前进*at++=*first++;}return at;
}
//本代码摘自《Essential C++》中文版P87

运行结果:

本例注意以下几处:

最后,为全篇内容做一简要整理:

  任务1,一开始写了一个函数,它可以找出vector内小于10的所有元素。然而函数过于死板,没有弹性。

  任务2,接下来,为函数加上了一个数值参数,让用户得以指定某个数值,以此和vector中的元素做比较。

  任务3,接着,加上了一个新参数:一个函数指针,让用户得以指定比较方式。

  任务4,然后,引入function object的概念,使我们得以将某种行为传给函数,此法比函数指针的做法效率更高。也简短地检阅了标准库提供的function object。最后,将函数以function template的方式重新实现。为了支持多种容器,传入一对iterator,标示出一组元素范围;为了支持多种元素类型,将元素类型参数化,也将应用于元素上的“比较操作”参数化,以便得以同时支持函数指针和function object两种方式。

  现在,我们的函数和元素类型无关,也和比较操作无关,更和容器类型无关。简单地说,我们已经将最初的函数转化为一个泛型算法了。

《Essential C++》笔记之设计一个泛型算法(二)相关推荐

  1. 《Essential C++》笔记之设计一个泛型算法(一)

      任务1:用户给予一个整数vector,我们必须返回一个新的vector,其中内含原vector之中小于10的所有数值.一个快速但缺乏弹性的解法是:   任务2:如果用户想找到所有小于11的元素,我 ...

  2. 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符

    题目描述 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符. 给定一个字符串(不一定全为字母)A及它的长度n.请返回第一个重复出现的字符.保证字符串中有重复字符,字符串的长度小于等于500 ...

  3. 设n个不同的整数排好序后存于T[1..n]中,若存在一个下标i(1≤ i ≤ n),使得T[i]=i。试设计一个有效算法找到这个下标,要求算法在最坏情形下的计算时间为O(log n)

    转自http://zmp1123.blog.163.com/blog/static/1193291592013314581911/ 设n 个不同整数排好序后存于T[0:n-1]中,若存在一个下标i,0 ...

  4. 设计一个Point(二维图中的点)类

    题目内容: 设计一个Point(点)类,具体要求如下: (1)该类具有成员变量x,y(int类型,表示点的横.纵坐标): (2)定义一个有参构造方法Point(int x,int y),将其一对坐标值 ...

  5. 字节ABtest平台探究笔记_设计一个AB试验

    文章目录 前言 1.利用ABtest平台介绍 2. 建立一个简单的试验(以推送试验为例) 3. 编辑试验信息 4. 根据试验结果进行最终决策 前言 随着互联网跑马圈地.砸钱圈人的野蛮生长的时代的落幕, ...

  6. 算法练习——在有序序列(r1,r2,...,rn)中,存在序号i(1<=i<=n),使得ri=i。请设计一个分治算法找到这个元素。 要求算法在最坏情况下的时间性能为O(logn))

    算法练习 题目 答案 注意 题目 答案 #include<iostream> using namespace std; int find(int a[],int left,int righ ...

  7. 设计一个高效算法,将顺序表的所有元素逆置,要求算法空间复杂度为O(1)。

    void ReverseList(SqList *L) {while(i<length||i>=0){if(j=0;j<(length-1)/2;j++){a=L->data[ ...

  8. 【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)

    C++ 泛型编程 中的泛型算法和STL(sort,find,find) 1. 引言 1.1 简述泛型编程和STL的重要性 1.2 介绍泛型算法的基本概念 2. STL中的泛型算法 2.1 定义及主要特 ...

  9. 算法设计之常见算法策略

    1 算法简介 1.1 算法的定义 ​ 算法(Algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作. 1.2 算法的特性 ​ 1.有穷性(Finite ...

最新文章

  1. 一根棉签解决身上各种酸痛,立马感觉无比舒畅!
  2. 人工智能的人文主义,如何让AI更有爱
  3. 每天一个linux命令(18):locate 命令
  4. 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。
  5. Altium designer快捷键汇总
  6. shell脚本常用语句用法笔记
  7. 03、动态代理--CGLib引入增强
  8. CenterOS 服务器之MySQL卸载与安装,并远程连接
  9. 【今日CV 计算机视觉论文速览 第145期】Fri, 19 Jul 2019
  10. 特征编码2 - 无监督一维编码(序数编码、计数编码)及python示例
  11. cakephp 学习1
  12. php检测移动浏览器,PHP 检测手机浏览器的代码
  13. 让电脑自动开机、关机以及取消开机密码
  14. 计算机 分类号,中图法分类号(计算机,自动化)(CLC number (computer, automation)).doc...
  15. php的qq邮箱正则表达式语法_正则表达式综合应用:qq邮箱提取
  16. vim 删除当前词_键盘快捷键 - 在VIM中的光标之后或周围删除单词
  17. 深度学习-人工神经网络网络
  18. 基于Mapbox实现地图的样式配置
  19. 笨方法学python40-42
  20. 2021年G3锅炉水处理考试总结及G3锅炉水处理模拟试题

热门文章

  1. 去除android控件滑动的时候出现的阴影
  2. 基于JAVA+SpringBoot+Vue+Mybatis+MYSQL的宿舍管理系统
  3. Effective C++ 笔记(1)让自己习惯c++
  4. 【算法】Huffman编码(数据结构+算法)
  5. eclipse设置工作空间编码为默认utf-8
  6. jetty之嵌入式运行jetty
  7. [转] 上级向的十个iOS面试问题
  8. ref与out之间的区别
  9. PDI的steps:(5:Add XML)
  10. c语言结果输出10遍,C语言 如何实现输出这样一系列输出结果