《C++ Primer Plus》第18章:探讨 C++ 新标准(9)
编程练习
-
下面是一个简短程序的一部分:
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; }
-
下面是类 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; }
-
编写并测试可变参数模板函数 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; }
-
使用 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)
编程练习 下面是一个简短程序的一部分: 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控制机械臂,但是控制过程中,机械臂总是会出现莫名的抽动。利用示波器测试PWM信号,发现信号正常。过程(1)在反复的测试过程中,队友提出,将示波器的地线放在左侧的GND波形…...
简单了解---性能测试
目录 一、什么是性能测试 二、常见的性能测试指标 1、并发 2、响应时间 3、事务 4、点击率 5、吞吐量 6、资源利用率 三、性能测试的分类 1、一般测试 2、负载测试 3、压力测试 4、稳定性测试 四、为什么要做性能测试? 五、影响性能的因素有哪些&…...

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

若依学习(前后端分离版)——启动时发生了啥?(@PostConstruct)(mybatis log free)
我们可以发现若依启动时执行了一些sql我们可以安装一个插件mybatis log free 来更好的进行sql查看 ,安装后需要修改一下若依的日志配置如下查看日志,我们发现执行了三个方法(),分别查询了一些数据。以第二个方法为例子…...
每日十问9c++-内存模型和名称空间
每日十问9c内存模型和名称空间 1.对于下面的情况,应使用哪种存储方案? a.homer 是函数的形参。 b. secret变量由两个文件共享。 c.topsecret 变量由一个文件中的所有函数共享,但对于其他文件来说是隐藏的。 d. beencalled 记录包含它的函数被调用的次数…...

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

Spring——什么是事务?传播行为?事务隔离级别有哪些?
思维导图一、什么是事务?多条DML要么同时成功,要么同时失败Transaction(tx)二、事务的四个过程:开启事务(start transaction)执行核心业务代码提交事务(如果核心业务处理过程中没有出…...

【项目实战】使用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); 上面的代码的意思是设置网卡信息,并将tun驱动设置为TAP模式。在TAP模式下,在用户空间下调用open打开/dev/net/tun驱动文件,发送(调用send函…...

[acwing周赛复盘] 第 93 场周赛20230304
[acwing周赛复盘] 第 93 场周赛20230304 一、本周周赛总结二、 4867. 整除数1. 题目描述2. 思路分析3. 代码实现三、 4868. 数字替换1. 题目描述2. 思路分析3. 代码实现四、4869. 异或值1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 彩笔了,只A…...
NOIP2022 T4 比赛
P8868 [NOIP2022] 比赛 题目大意 有两个长度为nnn的序列aaa和bbb,有qqq次询问,每次询问给出l,rl,rl,r,求 ∑ilr∑ji1r(maxkijak)(maxlijbl)\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 家有家法,行有行规。在家有家的规矩,入行有行的规矩。我们计算机一行就有一个命名的规矩,…...

论文投稿指南——中文核心期刊推荐(新闻事业)
【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...
【Linux】工具(4)——make/Makefile
本期博客我们的任务就是搞懂自动化构建工具——make/Makefile一、什么是make/Makefile📌make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make&…...

【企业服务器LNMP环境搭建】nginx安装
1、介绍(官方网址:nginx news ) 1.1 常见用法 1) web服务器软件 httpd http协议 同类的web服务器软件:apache nginx(俄罗斯) IIS(微软 fastcgi) lighttpd(德国) 2)代理服务器 反向代理 3)邮箱代理服务器 IMAP POP3 SMTP 4)负载均…...
Linux 配置规范 操作系统 _S3A3G3
目录 1.检查使用IP协议远程维护的设备是否配置SSH协议,禁用telnet协议 2.检查账户认证失败次数限制...

基于信息间隙决策理论的碳捕集电厂调度(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

【C语言进阶:指针的进阶】回调函数
本章重点内容: 字符指针指针数组数组指针数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数指针和数组面试题的解析什么是回调函数: 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

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.构…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
Springboot多数据源配置实践
Springboot多数据源配置实践 基本配置文件数据库配置Mapper包Model包Service包中业务代码Mapper XML文件在某些复杂的业务场景中,我们可能需要使用多个数据库来存储和管理不同类型的数据,而不是仅仅依赖于单一数据库。本技术文档将详细介绍如何在 Spring Boot 项目中进行多数…...

2025-06-08-深度学习网络介绍(语义分割,实例分割,目标检测)
深度学习网络介绍(语义分割,实例分割,目标检测) 前言 在开始这篇文章之前,我们得首先弄明白,什么是图像分割? 我们知道一个图像只不过是许多像素的集合。图像分割分类是对图像中属于特定类别的像素进行分类的过程,即像素级别的…...
ubuuntu24.04 编译安装 PostgreSQL15.6+postgis 3.4.2 + pgrouting 3.6.0 +lz4
文章目录 下载基础包下载源码包编译 PG编译 postgis编译安装 pgrouting下载源码包配置编译参数编译安装 初始化数据库建表并检查列是否使用了 lz4 压缩算法检查 postgis 与 pgrouting 是否可以成功创建 下载基础包 sudo apt update && sudo apt upgrade -y sudo apt i…...