当前位置: 首页 > news >正文

《C++ Primer Plus》第18章:探讨 C++ 新标准(9)

编程练习

  1. 下面是一个简短程序的一部分:

    int main() {using namespace std;// list of double deduced from list contentsauto q = average_list ({15.4, 10.7, 9.0});cout << q << endl;// list of int deduced from list contentscout << average_list({20, 30, 19, 17, 45, 38} ) << endl;// forced list of doubleauto ad = average_list<double>({'A', 70, 65.33 });cout << ad << endl;return 0;
    }
    

    请提供函数 average_list(),让该程序变得完整。它应该是一个模板函数,其中的类型参数指定了用作函数参数的 initialize_list 模板的类型以及函数的返回类型。
    答:

    #include<iostream>
    #include<initializer_list>template<typename T>
    T average_list(std::initializer_list<T> List){T t;for(auto iter = List.begin(); iter != List.end(); iter++ ){t += *iter;}t = t / List.size();return t;
    }int main() {using namespace std;// list of double deduced from list contentsauto q = average_list ({15.4, 10.7, 9.0});cout << q << endl;// list of int deduced from list contentscout << average_list({20, 30, 19, 17, 45, 38} ) << endl;// forced list of doubleauto ad = average_list<double>({'A', 70, 65.33 });cout << ad << endl;return 0;
    }
    
  2. 下面是类 Cpmv 的声明:

    class Cpmv {
    public:struct Info {std::string qcode;std::string zcode;};
    private:Info *pi;
    public:Cpmv();Cpmv(std::string q, std::string z);Cpmv(const Cpmv & cp);Cpmv(Cpmv && mv);~Cpmv();Cpmv & operator=(const Cpmv & cp);Cpmv & operator=(Cpmv && mv);Cpmv operator+(const Cpmv & obj) const;void Display() const;
    };
    

    函数 operator+() 应创建一个对象,其成员 qcode 和 zcode 有操作数的相应成员拼接而成。请提供为移动构造函数和移动复制运算符实现移动语义的代码。编写一个使用所有这些方法的程序。为方便测试,让各个方法都显示特定的内容,以便知道它们被调用。

    #include<string>
    #include<iostream>class Cpmv {
    public:struct Info {std::string qcode;std::string zcode;};
    private:Info *pi;
    public:Cpmv();Cpmv(std::string q, std::string z);Cpmv(const Cpmv & cp);Cpmv(Cpmv && mv);~Cpmv();Cpmv & operator=(const Cpmv & cp);Cpmv & operator=(Cpmv && mv);Cpmv operator+(const Cpmv & obj) const;void Display() const;
    };Cpmv::Cpmv() {std::cout << "default constructer" << std::endl;pi = new Info;pi->qcode = "null";pi->zcode = "null";
    }Cpmv::Cpmv(std::string q, std::string z){std::cout << "constructer" << std::endl;pi = new Info;pi->qcode = q;pi->zcode = z;
    }Cpmv::Cpmv(const Cpmv & cp){std::cout << "copy constructer" << std::endl;pi = new Info(*cp.pi);
    }Cpmv::Cpmv(Cpmv && mv){std::cout << "move constructor" << std::endl;pi = mv.pi;mv.pi = nullptr;
    }Cpmv::~Cpmv() {std::cout << "destructor" << std::endl;delete pi;
    }Cpmv & Cpmv::operator=(const Cpmv & cp) {std::cout << "assigment" << std::endl;if(this == &cp){return *this;}delete pi;pi = new Info(*cp.pi);return *this;
    }Cpmv & Cpmv::operator=(Cpmv && mv) {std::cout << "move assignment" << std::endl;delete pi;pi = mv.pi;mv.pi = nullptr;return *this;
    }Cpmv Cpmv::operator+(const Cpmv & obj) const {std::cout << "operator+" << std::endl;Cpmv c;c.pi->qcode = pi->qcode + obj.pi->qcode;c.pi->zcode = pi->zcode + obj.pi->zcode;return c;
    }void Cpmv::Display() const {std::cout << pi->qcode << " " << pi->zcode << std::endl;
    }int main(){{Cpmv c1;c1.Display();Cpmv c2("c2c2c2", "2c2c2c");c2.Display();Cpmv c3("c3c3c3", "c3c3c3");c3.Display();Cpmv c4(c3);c4.Display();Cpmv c5(c2+c3);c5.Display();c1 = c5;c1.Display();c1 = c5+c5;c1.Display();}return 0;
    }
    
  3. 编写并测试可变参数模板函数 sum_value(),它接受任意长度的参数列表(其中包含数值,但可以是任何类型),并以 long double 的方式返回这些数值的和。

    #include <ios>
    #include<iostream>template<typename T>
    long double sum_value(const T & t){return t;
    }
    template<typename T, typename... Args>
    long double sum_value(const T & t, const Args&... args){return t + sum_value(args...);
    }int main() {std::cout << sum_value(1,2,3,4,5) << std::endl;std::cout << sum_value(1,2,3,4,5,6,7) << std::endl;;std::cout.precision(5);std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);std::cout << sum_value(1,2,3,4,5,6,7,8,9) << std::endl;return 0;
    }
    
  4. 使用 lambda 重新编写程序清单 16.15。具体地说,使用一个有名称的 lambda 替换函数 outint(),并将函数符替换为两个匿名 lambda 表达式。

    // 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 << " ";}
    auto outint = [](int n) { std::cout << n << " ";};int main(){using std::list;using std::cout;using std::endl;//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++11 cna 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;std::for_each(etcetera.begin(), etcetera.end(), outint);cout << endl;yadayada.remove_if([](int n){return n > 100;});etcetera.remove_if([](int n){return n > 200;});cout << "Trimmed lists:\n";for_each(yadayada.begin(), yadayada.end(), outint);cout << endl;for_each(etcetera.begin(), etcetera.end(), outint);cout << endl;return 0;
    }
    

相关文章:

《C++ Primer Plus》第18章:探讨 C++ 新标准(9)

编程练习 下面是一个简短程序的一部分&#xff1a; int main() {using namespace std;// list of double deduced from list contentsauto q average_list ({15.4, 10.7, 9.0});cout << q << endl;// list of int deduced from list contentscout << averag…...

记录一次PWM信号异常问题

问题我使用单片机输出PWM控制机械臂&#xff0c;但是控制过程中&#xff0c;机械臂总是会出现莫名的抽动。利用示波器测试PWM信号&#xff0c;发现信号正常。过程&#xff08;1&#xff09;在反复的测试过程中&#xff0c;队友提出&#xff0c;将示波器的地线放在左侧的GND波形…...

简单了解---性能测试

目录 一、什么是性能测试 二、常见的性能测试指标 1、并发 2、响应时间 3、事务 4、点击率 5、吞吐量 6、资源利用率 三、性能测试的分类 1、一般测试 2、负载测试 3、压力测试 4、稳定性测试 四、为什么要做性能测试&#xff1f; 五、影响性能的因素有哪些&…...

1.机器学习笔记第一周

机器学习利用领域&#xff1a; 1&#xff1a;随着网络数据增大&#xff0c;需要搜集用户的数据&#xff0c;做喜好性偏向判断等。 2&#xff1a;只要有数据的&#xff0c;无论是医疗领域&#xff0c;还是基因领域都是需要机器学习来发现数据密码。 3&#xff1a;机器自我学习…...

若依学习(前后端分离版)——启动时发生了啥?(@PostConstruct)(mybatis log free)

我们可以发现若依启动时执行了一些sql我们可以安装一个插件mybatis log free 来更好的进行sql查看 &#xff0c;安装后需要修改一下若依的日志配置如下查看日志&#xff0c;我们发现执行了三个方法&#xff08;&#xff09;&#xff0c;分别查询了一些数据。以第二个方法为例子…...

每日十问9c++-内存模型和名称空间

每日十问9c内存模型和名称空间 1.对于下面的情况&#xff0c;应使用哪种存储方案? a.homer 是函数的形参。 b. secret变量由两个文件共享。 c.topsecret 变量由一个文件中的所有函数共享&#xff0c;但对于其他文件来说是隐藏的。 d. beencalled 记录包含它的函数被调用的次数…...

【python】JSON数据类型与Python数据类型之间的转化

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录JSON格式文件JSON格式序列化与反序列化作用JSON常用数据结构键值对的集合值的有序列表JSON数据类型与Python数据类型之间的转化JSON格式和python的区别读写json文件dump 把python 写到json文件load 把json写…...

Spring——什么是事务?传播行为?事务隔离级别有哪些?

思维导图一、什么是事务&#xff1f;多条DML要么同时成功&#xff0c;要么同时失败Transaction&#xff08;tx&#xff09;二、事务的四个过程&#xff1a;开启事务&#xff08;start transaction&#xff09;执行核心业务代码提交事务&#xff08;如果核心业务处理过程中没有出…...

【项目实战】使用Feign服务间相互调用,其实OpenFeign也没有想象中那么难嘛

一、Feign介绍 openfeign是一个java的http客户端,用来简化http调用 二、Feign架构(来自官方) Feign由五大部分组成, 由于刚开始接触 feign ,比较关注的 clients 跟 encoders/decoders 三、OKHTTP与Feign之间的关系 在Feign中,Client是一个非常重要的组件,Feign最终…...

tun驱动之ioctl

struct ifreq ifr; ifr.ifr_flags | IFF_TAP | IFF_NO_PI; ioctl(fd, TUNSETIFF, (void *)&ifr); 上面的代码的意思是设置网卡信息&#xff0c;并将tun驱动设置为TAP模式。在TAP模式下&#xff0c;在用户空间下调用open打开/dev/net/tun驱动文件&#xff0c;发送(调用send函…...

[acwing周赛复盘] 第 93 场周赛20230304

[acwing周赛复盘] 第 93 场周赛20230304 一、本周周赛总结二、 4867. 整除数1. 题目描述2. 思路分析3. 代码实现三、 4868. 数字替换1. 题目描述2. 思路分析3. 代码实现四、4869. 异或值1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 彩笔了&#xff0c;只A…...

NOIP2022 T4 比赛

P8868 [NOIP2022] 比赛 题目大意 有两个长度为nnn的序列aaa和bbb&#xff0c;有qqq次询问&#xff0c;每次询问给出l,rl,rl,r&#xff0c;求 ∑ilr∑ji1r(max⁡kijak)(max⁡lijbl)\sum\limits_{il}^r\sum\limits_{ji1}^r(\max\limits_{ki}^ja_k)\times(\max\limits_{li}^jb_l…...

计算机组成原理

目录 ❤ 控制器 ❤ 运算器 ❤ 控制器运算器(计算机的中央处理器CPU) ❤ 存储器 内存(主存) 外存 内存和外村的区别 ❤ 输入设备 ❤ 输出设备 ❤ 适配器 ❤ 总线 ❤ 启动计算机的流程 ❤ 机械硬盘 ❤ 固态硬盘 python从小白到总裁完整教程目录:https://b…...

1. 命名规范

1. 命名规范 成绩10开启时间2021年09月17日 星期五 18:00折扣0.8折扣时间2021年11月6日 星期六 00:00允许迟交否关闭时间2021年11月21日 星期日 00:00 家有家法&#xff0c;行有行规。在家有家的规矩&#xff0c;入行有行的规矩。我们计算机一行就有一个命名的规矩&#xff0c;…...

论文投稿指南——中文核心期刊推荐(新闻事业)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…...

【Linux】工具(4)——make/Makefile

本期博客我们的任务就是搞懂自动化构建工具——make/Makefile一、什么是make/Makefile&#x1f4cc;make是一个命令工具&#xff0c;是一个解释makefile中指令的命令工具&#xff0c;一般来说&#xff0c;大多数的IDE都有这个命令&#xff0c;比如&#xff1a;Delphi的make&…...

【企业服务器LNMP环境搭建】nginx安装

1、介绍&#xff08;官方网址&#xff1a;nginx news &#xff09; 1.1 常见用法 1) web服务器软件 httpd http协议 同类的web服务器软件&#xff1a;apache nginx(俄罗斯) IIS(微软 fastcgi) lighttpd(德国) 2)代理服务器 反向代理 3)邮箱代理服务器 IMAP POP3 SMTP 4)负载均…...

Linux 配置规范 操作系统 _S3A3G3

目录 1.检查使用IP协议远程维护的设备是否配置SSH协议,禁用telnet协议 2.检查账户认证失败次数限制...

基于信息间隙决策理论的碳捕集电厂调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

【C语言进阶:指针的进阶】回调函数

本章重点内容&#xff1a; 字符指针指针数组数组指针数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数指针和数组面试题的解析什么是回调函数&#xff1a; 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;作…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...