C++ primer plus 第16章string 类和标准模板库, 函数符概念

C++ primer plus 第16章string 类和标准模板库, 函数符概念

C++ primer plus 第16章string 类和标准模板库, 函数符概念

文章目录

  • C++ primer plus 第16章string 类和标准模板库, 函数符概念
  • 16.5.1 函数符概念
  • 程序清单16.15 functor.cpp


16.5.1 函数符概念

正如 STL定义了容器和迭代器的概念一样,它也定义了函数符概念。

  • 生成器(gencrator)是不用参数就可以调用的函数符。
  • 一元函数(unaryfunction)是用一个参数可以调用的函数符
  • 二元函数(binary function)是用两个参数可以调用的函数符。

例如,提供给foreach()的函数符应当是一元函数,因为它每次用于一个容器元素。当然,这些概念都有相应的改进版:

  • 返回 bool值的一元函数是谓词(predicate);
  • 返回 bool值的二元函数是二元谓词(binarypredicate)。

些 STL函数需要谓词参数或二元谓词参数。例如,程序清单16.9使用了sor()的这样一个版本,即将二元谓词作为其第3个参数:

bool WorseThan(const Review&rl,const Review&r2);
...
sort(books.begin(),books.end(),worseThan);

list 模板有一个将谓词作为参数的removei)成员,该函数将谓词应用于区间中的每个元素,如果谓词返回 true,则删除这些元素。例如,下面的代码删除链表three 中所有大于100的元素:

bool tooBig(int n){return n>100}:
list<int> scores;...
scores.remove_if(tooBig);

最后这个例子演示了类函数符适用的地方。假设要删除另一个链表中所有大于200的值。如果能将取舍值作为第二个参数传递给tooBig(),则可以使用不同的值调用该函数,但谓词只能有一个参数。然而,如果设计一个 TooBig 类,则可以使用类成员而不是函数参数来传递额

template<class T>
class TooBig
private :
T cutoff;
public :
TooBig(const T&t):cutoff(t){}
bool operator()(constT&v){return v>cutoff};
}:

这里,一个值(V)作为函数参数传递,而第二个参数(cutof)是由类构造函数设置的。有了该定义后,就可以将不同的TooBig对象初始化为不同的取舍值,供调用removei()时使用。程序清单 16.15 演示了这种技术。

程序清单16.15 functor.cpp

// functor.cpp -- using a functor
#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>template<class T>  // functor class defines operator()()
class TooBig
{
private:T cutoff;
public:TooBig(const T & t) : cutoff(t) {}bool operator()(const T & v) { return v > cutoff; }
};void outint(int n) {std::cout << n << " ";}int main()
{using std::list;using std::cout;using std::endl;using std::for_each;using std::remove_if;TooBig<int> f100(100); // limit = 100int vals[10] = {50, 100, 90, 180, 60, 210, 415, 88, 188, 201};list<int> yadayada(vals, vals + 10); // range constructorlist<int> etcetera(vals, vals + 10);// C++0x can use the following instead
//  list<int> yadayada = {50, 100, 90, 180, 60, 210, 415, 88, 188, 201};
//  list<int> etcetera {50, 100, 90, 180, 60, 210, 415, 88, 188, 201};cout << "Original lists:\n";for_each(yadayada.begin(), yadayada.end(), outint);cout << endl;for_each(etcetera.begin(), etcetera.end(), outint);cout << endl;yadayada.remove_if(f100);               // use a named function objectetcetera.remove_if(TooBig<int>(200));   // construct a function objectcout <<"Trimmed lists:\n";for_each(yadayada.begin(), yadayada.end(), outint);cout << endl;for_each(etcetera.begin(), etcetera.end(), outint);cout << endl;// std::cin.get();return 0;
}

-个函数符(f100)是一个声明的对象,而另一个函数符(TooBig(200))是一个匿名对象,它是由构造函数调用创建的。下面是程序清单16.15中程序的输出:

在这里插入图片描述
假设已经有了一个接受两个参数的模板函数:

template <class T>
bool tooBig(const T&val,const T& lim)
{
return val >lim;
}

则可以使用类将它转换为单个参数的函数对象:

template<class T>
class TooBig2
{
private:T cutoff;
public:TooBig2(const T&t):cutoff(t){}bool operator()(const T&v){return tooBig<T>(v,cutoff);}
};

即可以这样做:

TooBig2<int>tB100(100);
int x;
cin >> X;
if(tB100(x))	//same as if(tooBig(x,100))
...

因此,调用 tB100(x)相当于调用 tooBig(x,100),但两个参数的函数被转换为单参数的函数对象,其中第二个参数被用于构建函数对象。简而言之,类函数符TooBig2是一个函数适配器,使函数能够满足不同的接口。
在该程序清单中,可使用C++11的初始化列表功能来简化初始化。为此,可将如下代码:

int vals[10]={50100901806021041588188201};
list<int>yadayada(vals,vals +10);//range constructor
list<int>etcetera(vals,vals + 10);

替换为下述代码:

list<int>yadayada=(50,100,90,1806021041588188201}
list<int>etcetera(50,100,901806021041588188201};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3266825.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

20240725项目的maven环境报红-重新配置maven

1.在编辑器里面打开项目&#xff0c;导入源码 &#xff08;1&#xff09;找到项目的地址C:\Users\zzz\IdeaProjects\datasys&#xff0c;然后右击用idea编辑器打开。 &#xff08;2&#xff09;idea中上菜单栏打开open&#xff0c;然后输入file&#xff0c;选择源代码文件 2.…

C++ //练习 15.28 定义一个存放Quote对象的vector,将Bulk_quote对象传入其中。计算vector中所有元素总的net_price。

C Primer&#xff08;第5版&#xff09; 练习 15.28 练习 15.28 定义一个存放Quote对象的vector&#xff0c;将Bulk_quote对象传入其中。计算vector中所有元素总的net_price。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块&am…

openFeign配置okhttp

原来的项目出现了性能问题&#xff0c;老大不知道怎么的&#xff0c;让我改openFeign线程池为okhttp&#xff0c;说原生的不支持线程池性能比较差。 原openFeign配置文章地址 一、pom文件 <dependency><groupId>org.springframework.cloud</groupId><arti…

泰金新能估值暴增之谜:研发费用率远低同行,资产负债率居高不下

《港湾商业观察》施子夫 王璐 作为新“国九条”首家受理的科创板IPO企业&#xff0c;外界对于西安泰金新能科技股份有限公司&#xff08;以下简称&#xff0c;泰金新能&#xff09;的关注度自然相当之高。 泰金新能保荐机构为中信建投。通过招股书不难看出&#xff0c;公司的…

idea中导入外部依赖并打包到jar包中

前言&#xff1a; 很多时候在我们写项目对接三方的时候都需要导入三方jar包&#xff0c;而这时候我们用平常的pom里面写依赖发现导入不了&#xff08;直接把jar包放在本地导入的话打包的话也不会将该依赖打包进我们项目的jar包&#xff09;&#xff0c;我在网上找了几种方法 …

使用双指针法解决最大容积问题:移动较短的线以优化面积【双指针】

在解决算法问题时&#xff0c;我们常常需要寻找最佳的方法来提高效率。今天&#xff0c;我们将讨论一个经典的问题——在一组垂直线中找到两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。这篇文章将详细解析如何使用双指针法来解决这个问题&#xff0c;特别…

仪器校准中,标准样品要怎么选用?需要注意什么?

正确使用标准物质和标准样品是保证仪器校准值准确可靠的重要手段。标准物质的正确使用包括正确选择、正确使用&#xff08;防止误用&#xff09;和使用中的注意事项。 1. 参考资料证书之中给出的“参考资料的使用”信息&#xff0c;用户应予以注意。当参比材料用于证书所述用途…

自研点直播转码核心

1. 背景 视频转码是将视频文件经过解封装、解码、滤镜处理、编码、封装从而转换为另一个视频文件的过程&#xff0c;B站每天都有大量的视频原片上传后经过转码系统转换为多个不同分辨率。转换后的视频在画质接近原片的前提下会拥有更低的码率&#xff0c;因此会提高网络传输时的…

未来的智能农业:智能合约如何提升农业生产效率和可持续性

随着全球人口的增长和资源的有限性&#xff0c;农业生产面临着越来越大的挑战。如何在提高生产效率的同时保障可持续发展成为全球农业发展的关键问题。智能合约作为一种基于区块链技术的自动化执行合约&#xff0c;正在逐渐应用于农业领域&#xff0c;为农业生产带来了新的机遇…

Leetcode刷题-----移动零283复写零问题1089

目录 1.问题介绍 1.1题目要求 1.2思路分析 1.3想法实现 2.复写零问题 2.1问题分析 2.2思路分析 2.3想法实现 1.问题介绍 1.1题目要求 把这个数组里面为0的元素挪动到这个数组的后面&#xff0c;其他的非零元素的相对位置保持不变&#xff1b; 1.2思路分析 这个里面&a…

甄选范文“论软件测试中缺陷管理及其应用”软考高级论文,系统架构设计师论文

论文真题 软件缺陷指的是计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。缺陷的存在会导致软件产品在某种程度上不能满足用户的需要。在目前的软件开发过程中,缺陷是不可避免的。软件测试是发现缺陷的主要手段,其核心目标就是尽可能多地找…

场外期权如何报价?名义本金是什么?

今天带你了解场外期权如何报价&#xff1f;名义本金是什么&#xff1f;投资者首先需要挑选自己想要进行期权交易的沪深上市公司股票。选出股票后&#xff0c;需要将股票信息、预期的操作时间&#xff08;如期限&#xff09;、看涨或看跌的选择以及预计的交易金额等信息报给场外…

Cisco OSPF LSA 类型详解指南

注&#xff1a;机翻&#xff0c;未校对。 OSPF LSA Types: The Ultimate Guide OSPF LSA Types – OSPF LSA 类型 – OSPF uses LSAs or Link state Advertisements to share information of each network and populate the LSDB (Link State Database). The LSAs are used by…

ppt模板如何制作?5个工具让你事半功倍

让我瞧瞧是谁还在为寻找PPT模板而发愁&#xff1f; 其实这可不是什么难题~身为职场高效打工人的我&#xff0c;今天便特地为大家整理了5大ppt模板ai生成神器~想知道都有哪些选择吗&#xff1f;接着往下看你便清楚啦&#xff01; ✮迅捷PPT ☺使用场景&#xff1a;商业演示、教…

dsp c6657 SYS/BIOS学习笔记

1 SYS/BIOS简介 SYS/BIOS是一种用于TI的DSP平台的嵌入式操作系统&#xff08;RTOS&#xff09;。 2 任务 2.1 任务调度 SYS/BIOS任务线程有0-31个优先级&#xff08;默认0-15&#xff0c;优先级0被空闲线程使用&#xff0c;任务最低优先级为1&#xff0c;最高优先级为15&am…

《MySQL DBA 修炼之道》第五章 查询优化

《MySQL DBA 修炼之道》原文是在第六章 查询优化&#xff0c;博主觉得比较重要&#xff0c;所以想提前整理为一篇博文。 查询优化是研发人员比较关注也是疑问最多的领域。 基础知识 1. 查询优化的常用策略 一般的常用策略 优化数据访问、重写SQL、重新设计表、添加索引 4种…

【鸿蒙开发】鸿蒙ArkUI自定义组件如何封装一个好用的Toast/Loading/ProgressHUD组件

1. HUD 在移动端 App 开发中&#xff0c;Toast 、 Loading 和 Progress 是十分常用的UI控件&#xff0c;如果不做特殊要求&#xff0c;一般可以直接使用系统 API 提供的方法&#xff0c;但如果想要定制化 UI&#xff0c;就需要自定义实现了。 在 HarmonyOS 中&#xff0c;Toa…

Leetcode—769. 最多能完成排序的块【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—769. 最多能完成排序的块 实现代码 class Solution { public:int maxChunksToSorted(vector<int>& arr) {int ans 0;int mx INT_MIN;for(int i 0; i < arr.size(); i) {mx max(arr[i], mx);if(mx i) {a…

单GPU训练一天,Transformer在100位数字加法上就达能到99%准确率

乘法和排序也有效。 自 2017 年被提出以来&#xff0c;Transformer 已成为 AI 大模型的主流架构&#xff0c;一直稳站 C 位。 但所有研究者都不得不承认的是&#xff0c;Transformer 在算数任务中表现非常糟糕&#xff0c;尤其是加法&#xff0c;这一缺陷在很大程度上源于 Tra…