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

  任务2:如果用户想找到所有小于11的元素,我们要么新建立一个新函数,要么就得将此函数通用化,让用户得以指定某个上限值,像下面这样:

  任务3.1:下一个任务难度颇高。我们必须允许用户指定不同的比较操作,像是大于、小于、等等。如何才能将“比较操作”参数化呢?

有一个解法:以函数调用来取代less-than运算符。加入第三个参数pred,用它来指定一个函数指针,其参数列表有两个整数,返回值为bool.至此,less_than()的名称已不再适当,让我们称它为filter()吧:


站在用户的角度来考虑,为方便起见,我们同时定义了许多可传给filter()的关系比较函数:

站在用户的角度来考虑,用户亦可传入上述函数,或其他自定义的关系比较函数。唯一一个限制就是这些函数必须返回bool,而且参数列表只接受两个整数。以下是filter()的使用方式:

  接下来的最后工作,便是实现出filter():

现在让我们在编译器中把上述内容实际实现一遍:

//小问学编程
#include<iostream>
#include<algorithm>
#include<vector>using namespace std;vector<int> filter_ver1(const vector<int> &vec, int filter_value,bool(*pred)(int,int));
bool less_than( int v1, int v2 );
bool greater_than( int v1, int v2 );int main()
{int target=10;vector<int> myvec{1,2,5,6,7,8,9,12,34,33,34,87};cout<<"myvec中比"<<target<<"小的数是newvec: ";vector<int> newvec=filter_ver1(myvec,target,less_than);for(int i=0;i<newvec.size();++i)cout<<newvec[i]<<' ';return 0;
}bool less_than( int v1, int v2 ){ return v1 < v2 ? true : false; }bool greater_than( int v1, int v2 ){ return v1 > v2 ? true : false; }vector<int> filter_ver1(const vector<int> &vec, int filter_value,bool(*pred)(int,int))
{vector<int> nvec;for(int ix=0;ix<vec.size();++ix)//比较pred所指函数//比较vec[ix]和filter_value.if (pred(vec[ix],filter_value))nvec.push_back(vec[ix]);return nvec;
}

运行结果:

注意本例以下几处:

  任务3.2:上面filter()使用for循环遍历每个元素。现在让我们以泛型算法find_if()来取代for循环的使用。我将find_if()反复作用于数列身上,找出符合条件的每一个元素——所谓“条件”则由用户指定的函数指针定义。这要怎么做到呢?

让我们从“找出每个等于10的元素”开始吧。泛型算法find_if()接受三个参数:两个iterator标示出检测范围,第三个参数是我们想要寻找的数值。以下程序代码中,count_occurs()说明如何在“不对任一元素进行两次以上的查看”前提下,反复地在容器身上进行find():

我们在while循环之内将find()的返回值设给iter。find()返回一个iterator,指向元素值为val的元素。如果没有找到任何符合条件的元素,就返回一个等同于vec.end()的iterator。一旦iter等同于vec.end(),循环即终止。

现在让我们在编译器中把上述内容实际实现一遍:

//小问学编程
#include<iostream>
#include<algorithm>
#include<vector>using namespace std;int count_occurs(const vector<int>& vec,int val);int main()
{int target=10;vector<int> myvec{1,2,5,6,7,8,9,10,12,34,33,34,87};if(count_occurs(myvec,target))cout<<"找到target了";elsecout<<"没有找到target";return 0;
}int count_occurs(const vector<int>& vec,int val)
{vector<int>::const_iterator iter = vec.begin();int occurs_count = 0;while ((iter=find(iter,vec.end(),val)) != vec.end() ){++occurs_count;++iter;//指向下一个元素}return occurs_count;
}

运行结果:

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

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

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

    前文:<Essential C++>笔记之设计一个泛型算法(一) 相关博文:C++头文件<functional>和bind.placeholders占位符使用简单例子 相关博文 ...

  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. 字节ABtest平台探究笔记_设计一个AB试验

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

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

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

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

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

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

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

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

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

  9. C++prime读书笔记(二)C++标准库:IO、容器、泛型算法、动态内存

    layout: post title: C++prime读书笔记(二)C++标准库:IO.容器.泛型算法.动态内存 description: C++prime读书笔记(二)C++标准库:IO.容器.泛 ...

最新文章

  1. java 变量 动态类型_Java:如何将变量从一种类型动态转换为另一种类型?
  2. python入门操作学习
  3. 经典C语言程序100例之七七
  4. Linux C编程之四 动态库(共享库)的制作
  5. 22行代码AC,三种解法——例题3-6_环状序列(UVa-1584)
  6. Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext
  7. springboot项目和云服务器,以及域名的申请和使用(后续持续更新)
  8. 前端:JS/27/HTML DOM简介和新特性,HTML DOM访问HTML元素的方法,元素对象的属性(标准属性),noscroll事件,实例:书讯快递
  9. 实用的 Python 之 feedparser
  10. python单词的含义-学Python必背的初级单词,你都背了吗?
  11. leetcode(105)从前序遍历和中序遍历构建二叉树
  12. Atitit Atitit 零食erp数据管理---世界著名零食系列数据.docx世界著名零食
  13. js监听scrolltop_js中scrollTop()方法和scroll()方法用法示例
  14. 在delphi的dbgrid中插入其他可视组件_delphi教程
  15. matlab好看的字体,最佳50个新鲜+漂亮的字体(2011)
  16. 数据压缩和归档(二)、zipfile
  17. 案例:恒丰银行——大数据实时流处理平台
  18. 使用邮箱教学|邮箱是什么?办公中是怎么使用的
  19. 区块链-以太坊学习资料汇总
  20. wordpress内容调用_WordPress网站的基本内容

热门文章

  1. 基于JAVA+SpringMVC+Mybatis+MYSQL的在线超市管理系统
  2. 基于JAVA+SpringBoot+Mybatis+MYSQL的在线点餐系统
  3. java 窗口鼠标句柄_c#获取窗体句柄模拟鼠标点击
  4. 剑指offer:滑动窗口的最大值(栈和队列)
  5. 题解P3951【小凯的疑惑】
  6. Elasticsearch 技术分析(七): Elasticsearch 的性能优化
  7. MapReduce任务学习系列
  8. 测试用例编写(功能测试框架)
  9. springboot配置监听器、过滤器和拦截器
  10. python中生成器的两段代码