当前位置: 首页 > 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;作…...

如何通过InstantClick事件回调实现精准的性能监控:开发者必备指南

如何通过InstantClick事件回调实现精准的性能监控&#xff1a;开发者必备指南 【免费下载链接】instantclick InstantClick makes following links in your website instant. 项目地址: https://gitcode.com/gh_mirrors/in/instantclick InstantClick是一款能让网站链接…...

终极PDF批量处理指南:如何用PDF Arranger自动化文档操作

终极PDF批量处理指南&#xff1a;如何用PDF Arranger自动化文档操作 【免费下载链接】pdfarranger Small python-gtk application, which helps the user to merge or split PDF documents and rotate, crop and rearrange their pages using an interactive and intuitive gra…...

FPGA网络加速入门:拆解Xilinx 7系列GTP与1G/2.5G Ethernet PCS/PMA IP核,搞懂SGMII接口那些事

FPGA网络加速实战&#xff1a;从Xilinx GTP架构到SGMII接口的深度解析 在FPGA高速通信领域&#xff0c;以太网接口设计一直是工程师面临的核心挑战之一。当我们需要在Xilinx 7系列FPGA上实现1G/2.5G以太网功能时&#xff0c;GTP收发器与PCS/PMA IP核的配置往往成为项目成败的关…...

文墨共鸣惊艳效果:古风UI下实时语义相似度计算与墨韵动画演示

文墨共鸣惊艳效果&#xff1a;古风UI下实时语义相似度计算与墨韵动画演示 1. 项目概览 文墨共鸣是一个将深度学习技术与传统水墨美学完美结合的系统。它基于先进的StructBERT模型&#xff0c;能够智能分析两段文字之间的语义相似度&#xff0c;并通过优雅的古风界面直观展示结…...

OPENIPC[ssc338Q+hi3536dv100]开源图传----硬件选型与实战避坑指南

1. 开源图传系统硬件选型逻辑 第一次接触OPENIPC开源图传时&#xff0c;我和大多数新手一样被各种专业术语搞得头晕眼花。经过三个月的实际搭建和测试&#xff0c;终于摸清了硬件选型的门道。这里分享的不仅是参数对比&#xff0c;更是我踩过坑后总结的实战经验。 核心硬件架构…...

AW88195音频编解码器驱动从MTK到RK平台的移植实践

1. 认识AW88195音频编解码器驱动移植 第一次接触AW88195音频编解码器驱动移植时&#xff0c;我也是一头雾水。这个来自艾为的音频芯片主要用于提升扬声器音质&#xff0c;但厂商提供的驱动包往往只适配特定平台。比如这次遇到的AW88195_Driver_MTK_V0.1.6.zip就是专门为MTK平台…...

Qwen3.5-2B图文对话实战:教育场景中学生作业图题智能解析案例

Qwen3.5-2B图文对话实战&#xff1a;教育场景中学生作业图题智能解析案例 1. 引言&#xff1a;教育场景中的AI助手需求 想象一下这样的场景&#xff1a;晚上10点&#xff0c;孩子拿着数学作业来问问题&#xff0c;题目是一张手绘的几何图形。家长可能已经忘记了几十年前学过的…...

终极指南:如何使用RPGMakerDecrypter轻松解密游戏资源

终极指南&#xff1a;如何使用RPGMakerDecrypter轻松解密游戏资源 【免费下载链接】RPGMakerDecrypter Tool for extracting RPG Maker XP, VX and VX Ace encrypted archives. 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerDecrypter RPGMakerDecrypter是一款…...

Graph Node高级配置:环境变量与配置文件详解

Graph Node高级配置&#xff1a;环境变量与配置文件详解 【免费下载链接】graph-node Graph Node indexes data from blockchains such as Ethereum and serves it over GraphQL 项目地址: https://gitcode.com/gh_mirrors/gr/graph-node Graph Node 作为区块链数据索引…...

利用COMSOL软件对变压器局部放电超声波传播特性进行了有限元声学仿真,首先建立包括变压器油、...

利用COMSOL软件对变压器局部放电超声波传播特性进行了有限元声学仿真&#xff0c;首先建立包括变压器油、铁芯、绕组和基座的变压器几何模型&#xff0c;选取符合声压波动方程的压力声学物理场&#xff0c;建立了局放超声波声源模型&#xff0c;可用于研究固定声源的声压时间和…...