C++ Primer Plus chapter 18

exercies 1

考察 std::initializer_list <>

这份template函数参照简单的例子书写。这种方式会简单很多。

注意到我后面两次调用函数  average_list, 它的 std::initializer_list <>并不相同

#include<iostream>
#include<initializer_list>
#include<algorithm>double sum(std::initializer_list<double> i)
{double tot = 0;std::for_each(i.begin(), i.end(), [&tot](double db){tot += db;});return tot;
}template<typename T>
T average_list(const std::initializer_list<T> list)
{T temp = 0;std::for_each(list.begin(), list.end(), [&list,&temp](T value){temp += value;});return temp;
}int main()
{/*double result = sum({2.5,4.2,1.5});std::cout << result << "\n";*/auto q = average_list({ 2.5,4.2,1.5 });std::cout << q << "\n";std::cout << average_list({20, 30, 19, 17, 45, 38}) << "\n";auto p = average_list<double>({'A', 70, 65.33});    // u pass in a type explicitlystd::cout << p;return 0;
}

exercies 2

在简单的类成员函数的基础上添加了 move semantic,移动构造 和 移动赋值。

driver的驱动函数可以自己实现,没有困难。

#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&);Cpmv(Cpmv&& rhs);~Cpmv();Cpmv& operator=(const Cpmv& cp);Cpmv& operator=(Cpmv&&);Cpmv operator+(const Cpmv& obj) const;void Display() const;
};Cpmv::Cpmv():pi(nullptr)
{   }Cpmv::Cpmv(std::string q, std::string z)
{pi->qcode = q;pi->zcode = z;
}Cpmv::Cpmv(const Cpmv& rhs)
{pi = new Info;pi->qcode = rhs.pi->qcode;pi->zcode = rhs.pi->zcode;
}Cpmv::Cpmv(Cpmv&& rhs)
{pi = rhs.pi;rhs.pi = nullptr;
}Cpmv::~Cpmv()
{delete pi;
}Cpmv& Cpmv::operator=(const Cpmv& cp)
{Info* ptmp = pi;pi = new Info;pi->qcode = cp.pi->qcode;pi->zcode = cp.pi->zcode;delete ptmp;
}Cpmv& Cpmv::operator=(Cpmv&& rhs)
{delete pi;pi = rhs.pi;rhs.pi = nullptr;
}Cpmv Cpmv::operator+(const Cpmv& rhs) const
{Cpmv tmp;tmp.pi->qcode = pi->qcode + rhs.pi->qcode;tmp.pi->zcode = pi->zcode + rhs.pi->zcode;return tmp;
}void Cpmv::Display() const
{std::cout << pi->qcode << ", " << pi->zcode;return;
}

exercise 3

variadic template 简单的 packing,unpacking,recursion应用

#include<iostream>
#include<string>long double sum = 0;
void show_list() {}template<typename T>
void show_list(const T value)
{sum += value;//std::cout << value << '\n';
}template<typename T, typename... Args>
void show_list(const T value, const Args... args)
{//std::cout << value << ", ";sum += value;show_list(args...);
}int main()
{int n = 143;double x = 2.2345;int xyz = 23452;std::string mr = "Mr Q, go ahead\n";show_list(x,n,xyz);//show_list(n, x, mr);std::cout << sum;return 0;
}

后续更新改进点,不使用全局变量,如何记载数据

需要确认,从设计角度,template function能否有跟类型无关的参数,这是否是正确的、好的设计思路

exercise 4

找不到题目的位置, 把书上18.5抄了一份,作为lambda表达式的例子。

单为了使用 lambda 表达式,不需要这么多的头文件。

#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>const long size = 302300L;int main()
{std::vector<int> numbers(size);std::srand(std::time(0));std::generate(numbers.begin(), numbers.end(), std::rand);int count3a = 0;int count3b = 0;int count13 = 0;auto Ismod3 = [](int x) -> bool { return x % 3 == 0; };auto mod3n13a = [&count3a, &count13](int x) {count3a += x % 3 == 0;count13 += x % 13 == 0;};auto mod3n13b = [&count3b, &count13](int x) {if (x % 3 == 0) ++count3b; // explicit conditionalif (x % 13 == 0) ++count13;};int the3 = std::count_if(numbers.begin(), numbers.end(), Ismod3);std::for_each(numbers.begin(), numbers.end(), mod3n13a);std::for_each(numbers.begin(), numbers.end(), mod3n13b);std::cout << "Count from std::count_if: " << the3 << "\n";std::cout << "Count from mod3n13a: " << count3a << ", " << count13 << std::endl;std::cout << "Count from mod3n13b: " << count3b << ", " << count13 << std::endl;return 0;
}

conclusion

日后写代码,需要注意边界条件,尤其是 依赖于中间状态及转换。需要小心验证,考虑到编译器会对我们的代码进行优化,有可能会产生意料之外的结果。

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

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

相关文章

PVE纵览-PVE与VM:谁才是你的最佳虚拟化选择?

PVE纵览-PVE与VM&#xff1a;谁才是你的最佳虚拟化选择&#xff1f; 文章目录 PVE纵览-PVE与VM&#xff1a;谁才是你的最佳虚拟化选择&#xff1f;摘要1 不同虚拟化平台的基础2 平台特性与功能3 性能与可靠性4 成本与经济性5 应用场景比较6 用户体验与支持7 结论与建议 关键字&…

陪诊问诊APP开发实战:基于互联网医院系统源码的搭建详解

时下&#xff0c;开发一款功能全面、用户体验良好的陪诊问诊APP成为了医疗行业的一大热点。本文将结合互联网医院系统源码&#xff0c;详细解析陪诊问诊APP的开发过程&#xff0c;为开发者提供实用的开发方案与技术指导。 一、陪诊问诊APP的背景与功能需求 陪诊问诊APP核心目…

post sim下如何将timing信息反标到仿真工具

文章目录 0 前言1 调用格式2 option介绍2.1 sdf_file (**必须**)2.2 module_instance (**可选**)2.3 config_file (**可选**)2.4 log_file (**可选**)2.5 mtm_spec (**可选**)2.6 scale_factors (**可选**)2.7 scale_type (**可选**) 0 前言 跑post sim时需要带入timing信息&a…

C++builder中的人工智能(16):神经网络中的SoftPlus激活函数

现在我们继续探索一下SoftPlus激活函数在人工神经网络&#xff08;ANN&#xff09;中的应用。了解SoftPlus激活函数的工作原理&#xff0c;将有助于您在使用C IDE构建C应用程序时更加得心应手。 目录 神经网络中的激活函数是什么&#xff1f;能在C中创建激活函数吗&#xff1f…

【图】图学习

0 回顾数据结构逻辑 1 图的定义和基本术语 必须有顶点&#xff0c;可以没有边。 Cn2和2*Cn2&#xff08;数学上的&#xff0c;n个顶点取2个顶点&#xff09; 概念有些多。。。。。。

类和对象(C++)(中)

1. 类的默认成员函数 默认成员函数就是⽤⼾没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类&#xff0c;我们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是前4个&#xff0c;最后两个取地址重载不重…

港科夜闻 | 香港科大校董会汇聚顶尖医学专家及学者,为筹建第三间医学院提供专业意见...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大校董会汇聚顶尖医学专家及学者&#xff0c;为筹建第三间医学院提供专业意见。为支持政府及其新成立的工作组发展香港成为国际医疗培训、研究和创新枢纽&#xff0c;以及培养更多医生的愿景&#xff0c;香港科大于…

23.智能停车计费系统(基于springboot和vue的Java项目)

目录 1.系统的受众说明 2 相关概念和技术介绍 2.1 JAVA技术介绍 2.2 SpringBoot框架 2.3B/S架构 2.4 MySQL数据库 3 系统需求分析 3.1 问题定义 3.2 可行性分析 3.3系统用例分析 3.4 系统流程分析 3.4.1 登录流程 3.4.2 添加信息流程 3.4.3 删除信息流程 4…

golang安装,常用框架安装,记忆点

0.安装 虚拟机扩容 【Linux干货分享】LVM快速扩容虚拟机磁盘_哔哩哔哩_bilibili newvim 安装 sudo add-apt-repository ppa:neovim-ppa/stable sudo apt-get update sudo apt-get install -y neovim 最强Vim新手指南&#xff0c;手把手教你打造只属于自己的代码编辑器&am…

【Unity】Unity拖拽在Android设备有延迟和卡顿问题的解决

一、介绍 在制作Block类游戏时&#xff0c;其核心的逻辑就是拖拽方块放入到地图中&#xff0c;这里最先想到的就是Unity的拖拽接口IDragHandler,然后通过 IPointerDownHandler, IPointerUpHandler 这两个接口判断按下和松手&#xff0c;具体的实现逻辑就是下面 public void On…

云计算在esxi 主机上创建 4g磁盘,同时在此磁盘上部署linux

1 创建4g 磁盘 这个状态说明esxi 已经启动好 开启esxi 这个操作系统已经安装 这个在我们pc 上ping esxi 主机可以正常通信 这个是esxi 主机的界面 开始添加硬盘4g 重新登 在我们的esxi 主机上新增了8g的空间 很明显这是给我们 的磁盘空间装文件系统 这个很明显是格式化把文件…

关于圆周率-4

在这里总结一下&#xff0c;以上分析&#xff0c;都是基于“单位”的。计算圆周率的时候&#xff0c;我们考虑的是做一个单位来理解&#xff0c;而它的倍数则作为某种比例缩放来理解。同理欧拉函数&#xff0c;也是用弧长来作为单位的&#xff0c;其它弧长则是基于这个单位的比…

嘉吉携百余款产品与解决方案再度亮相进博会

第七届中国国际进口博览会&#xff08;下称“进博会”&#xff09;于11月5日至10日在上海国家会展中心举办。嘉吉连续第七年参与进博会&#xff0c;并以“新质绿动&#xff0c;共赢未来”为参展主题&#xff0c;携超过120款创新产品与解决方案&#xff0c;共赴进博之约。 今年嘉…

docker网络配置:bridge模式、host模式、container模式、none模式

docker网络模式选择 docker网络配置&#xff1a;bridge模式、host模式、container模式、none模式 - 熊仔其人 - 博客园 docker网络配置&#xff1a;bridge模式、host模式、container模式、none模式 在docker平台里有四种网络模式&#xff0c;今天继续分享一下它们的常用知识&a…

教材下载 3.2.5| 国家中小学智慧教育平台下载器,支持预览

教材下载是一款国家中小学智慧教育平台的下载器&#xff0c;绿色免安装&#xff0c;用户只需解压后双击exe文件即可使用。软件涵盖了小学、初中、高中以及特殊教育的教材内容&#xff0c;并支持选择不同的学科和版本。所有教材均支持在线预览&#xff0c;用户还可以下载PDF文件…

系统架构(01架构的特点,本质...)

目录 学习前言 一、软件架构简介 二、系统复杂性的来源与应对 三、大型网站的特点 四、大型网站架构目标 五、参考文献 学习前言 本节总结下架构相关的基础知识&#xff1a;概述&#xff0c;特点&#xff0c;目标&#xff0c;本质... 一、软件架构简介 所谓架构&#x…

飞凌嵌入式FET527N-C核心板现已适配Android 13

飞凌嵌入式FET527N-C核心板现已成功适配Android13&#xff0c;新系统的支持能够为用户提供更优质的使用体验。那么&#xff0c;运行Android13系统的FET527N-C核心板具有哪些突出的优势呢&#xff1f; 1、性能与兼容性提升 飞凌嵌入式FET527N-C核心板搭载了全志T527系列高性能处…

如何借助AI 来提高开发效率

前言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;特别是大规模语言模型&#xff08;如 GPT 系列&#xff09;的崛起&#xff0c;软件开发领域正在经历一场革命。AI 大模型不仅在代码生成方面展现出强大的能力&#xff0c;还在测试、维护和创新等多个环…

C++ 高效率整型大数运算项目优化——内置类型存储与计算

C 高效率整型大数运算项目优化——内置类型存储与计算 一、前言二、优化设计分析类的设计 三、设计实现加法减法乘法对于 lint&#xff1a;对于 iint&#xff1a; 左移与右移左移右移 除法基本除法借用内置类型计算第一种情况第二种情况其他情况区间定位二分计数内置类型求近似…

Qt教程(007):资源文件添加

文章目录 7.1 创建新的项目7.2 添加资源文件7.2 设置页面7.1 创建新的项目 选择创建项目类型 输入项目名称 勾选UI界面 7.2 添加资源文件 选中项目名称,右键,选择【Add New】 添加资源文件 选择Qt Resource File文件