从0开始学习C++ 第二十课:模板与泛型编程

第二十课:模板与泛型编程

学习目标:

  • 掌握模板的基本语法和概念。
  • 学会使用函数模板来创建可重用的函数。
  • 学习如何定义类模板以实现数据结构的泛型。
  • 理解模板在C++中提供的灵活性和强大功能。

学习内容:

  1. 模板的概念:
    模板是C++中支持泛型编程的一种工具,它允许程序员编写与数据类型无关的代码。模板可以应用于函数和类。

  2. 函数模板:
    函数模板允许你编写一个适用于任何数据类型的函数。

    代码示例:

    // 函数模板
    template <typename T>
    T max(T a, T b) {return (a > b) ? a : b;
    }// 使用函数模板
    int main() {int i = max(10, 5); // 使用int类型double d = max(10.5, 5.5); // 使用double类型cout << "Max of 10 and 5 is " << i << endl;cout << "Max of 10.5 and 5.5 is " << d << endl;return 0;
    }
    
  3. 类模板:
    类模板允许你创建可以处理任何数据类型的类。例如,你可以创建一个泛型的Array类,可以存储任何类型的数组。

    代码示例:

    template <typename T>
    class Array {
    private:T* elements;int size;
    public:Array(int size) : size(size) {elements = new T[size];}~Array() {delete[] elements;}// 其他成员函数...
    };// 使用类模板
    int main() {Array<int> intArray(12); // 整型数组Array<double> doubleArray(12); // 双精度浮点数组// ...使用数组return 0;
    }
    
  4. 模板的使用场景:
    当需要创建可在多种数据类型之间进行操作的函数或类时,模板是非常有用的。它们是实现算法库如STL(Standard Template Library)的基石。

练习题:

编写一个函数模板swap,它接受两个同类型的参数并交换它们的值。在main函数中,创建两个整数和两个字符串,使用你的swap函数模板来交换它们的值,并打印出交换前后的结果。

答案:

#include <iostream>
#include <string>
using namespace std;// 函数模板
template <typename T>
void swap(T& a, T& b) {T temp = a;a = b;b = temp;
}int main() {int num1 = 1, num2 = 2;string str1 = "Hello", str2 = "World";cout << "Before swap: " << num1 << " " << num2 << endl;swap(num1, num2);cout << "After swap: " << num1 << " " << num2 << endl;cout << "Before swap: " << str1 << " " << str2 << endl;swap(str1, str2);cout << "After swap: " << str1 << " " << str2 << endl;return 0;
}

预计输出效果:

Before swap: 1 2
After swap: 2 1
Before swap: Hello World
After swap: World Hello

在这个练习中,我们看到swap函数模板如何用于不同类型的数据,展示了模板在编写泛型代码中的强大能力。通过学习模板,我们可以提高代码的重用性和灵活性。

目录
第二十一课:异常处理

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Git添加.gitignore文件后不生效的问题

1. 问题描述 如上图所示&#xff0c;在已存在.gitignore文件且已经提交过的Git管理的项目中&#xff0c;其中.class、.jar文件以及.idea目录内的内容全部都还是被Git管理了&#xff0c;可见.gitignore文件并没有生效。 2. 原因发现 .gitignore文件只能作用于 Untracked Files…

eNSP学习——配置通过FTP进行文件操作

原理概述&#xff1a; FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是在TCP/IP网络和Internet上最早使用的协议之一&#xff0c;在TCP/IP协议族中属于应用层协议&#xff0c;是文件传输的Internet标准。主要功能是向用户提供本地和远程主机…

python--pyQt5 对话框使用(QInputDialog) PySide6

参考&#xff1a; https://www.cnblogs.com/XJT2018/p/10208710.html https://blog.csdn.net/panrenlong/article/details/79948261 含参数详解&#xff1a; https://blog.csdn.net/zhulove86/article/details/52515460 一、简介 QInputDialog类提供了一个简单的便捷对话框&a…

开源模型应用落地-业务整合篇(三)

一、前言 在之前的两篇文章中,我们学习了如何构建基本的即时消息(IM)功能。今天,我们将进一步将IM模块与AI服务进行连接,实现用户提问并由模型进行回答,最后将结果展示在用户界面上。 二、术语 2.1. Spring Boot 是一个用于快速构建基于Spring框架的Java应用程序的开源框…

python 编写dll给c++调用

Python可以通过ctypes库将Python函数封装为DLL文件&#xff0c;以便C程序调用。下面是一个简单的示例&#xff1a; 创建一个Python脚本&#xff0c;其中包含要封装的函数&#xff0c;例如&#xff1a; def add(x, y): return x y 将该脚本编译为DLL文件。可以使用pyinstalle…

深入浅出AI落地应用分析:AI音乐生成之「Suno.ai」

接下来会每周集中体验一些通用或者垂直的AI落地应用&#xff0c;主要以一些全球或者国外国内排行较前的产品为研究对象&#xff0c;「AI 产品榜&#xff1a; aicpb.com」以专题的方式在博客进行分享。 本节主要介绍和体验AI音乐生成应用产品Suno AI&#xff0c;Suno来自目前最…

HQL,SQL刷题简单查询,基础,尚硅谷

今天刷SQL简单查询&#xff0c;大家有兴趣可以刷一下 目录 相关表数据&#xff1a; 题目及思路解析&#xff1a; 总结归纳&#xff1a; 知识补充&#xff1a; 关于LIKE操作符/运算符 LIKE其他使用场景包括 LIKE模糊匹配情况 相关表数据&#xff1a; 1、student_info表 2、sc…

Unity中URP下获取主灯信息

文章目录 前言一、计算BulinnPhone的函数有两个重载1、 目前最新使用的是该方法&#xff08;这是我们之后主要分析的函数&#xff09;2、 被淘汰的老方法&#xff0c;需要传入一堆数据 二、GetMainLight1、Light结构体2、GetMainLight具有4个方法重载3、1号重载干了什么&#x…

主动轮廓——计算机视觉中的图像分割方法

​ 一、说明 简单来说&#xff0c;计算机视觉就是为计算机提供类似人类的视觉。作为人类&#xff0c;我们很容易识别任何物体。我们可以很容易地识别山丘、树木、土地、动物等&#xff0c;但计算机没有眼睛&#xff0c;也没有大脑&#xff0c;因此它很难识别任何图像。计算机只…

Linux下软件安装的命令【RPM,YUM】及常用服务安装【JDK,Tomcat,MySQL】

Linux下软件安装的命令 源码安装 以源代码安装软件&#xff0c;每次都需要配置操作系统、配置编译参数、实际编译&#xff0c;最后还要依据个人喜好的方式来安装软件。这个过程很麻烦很累人。 RPM软件包管理 RPM安装软件的默认路径: 注意&#xff1a; /etc 配置文件放置目录…

docker network网络

网络分类 bridge网络 bridge是docker默认网络模式&#xff0c;docker安装后会选择一个私有网段作为bridge的子网&#xff0c;在我们创建容器时默认会将容器网络加入到这个子网中。 原理&#xff1a;Docker Daemon&#xff08;后台进程&#xff09; 利用 veth pair 技术&#…

502. IPO(贪心算法+优先队列/堆)

整体思想&#xff1a;在满足可用资金的情况下&#xff0c;选择其中利润最大的业务&#xff0c;直到选到k个业务为止&#xff0c;注意k可能比n大。 每次选择完一个业务&#xff0c;可用资金都会变动&#xff0c;这是可选择的业务也会变化&#xff0c;因此每次将可选择的业务放在…

3dmax渲不出模型是什么原因---模大狮模型网

3DMax无法渲染模型可能有多种原因。以下是一些常见的问题和解决方法&#xff1a; 材质设置错误&#xff1a;检查模型的材质设置是否正确&#xff0c;包括纹理贴图的路径、UV映射是否正确等。确保材质的属性设置正确&#xff0c;如颜色、反射率、透明度等。 灯光设置问题&#…

【JS逆向学习】某壁纸下载(ast混淆)

逆向目标 目标网址&#xff1a;https://bz.zzzmh.cn/index逆向接口一&#xff1a;https://api.zzzmh.cn/bz/v3/getData逆向接口二&#xff1a;https://cdn2.zzzmh.cn/wallpaper/origin/0d7d8d691e644989b72ddda5f695aca2.jpg?response-content-dispositionattachment&aut…

AnimatedDrawings:让绘图动起来

老样子&#xff0c;先上图片和官网。这个项目是让绘制的动画图片动起来&#xff0c;还能绑定人体的运动进行行为定制。 快速开始 1. 下载代码并进入文件夹&#xff0c;启动一键安装 git clone https://github.com/facebookresearch/AnimatedDrawings.gitcd AnimatedDrawingspip…

react18介绍

改进已有属性&#xff0c;如自动批量处理【setState】、改进Suspense、组件返回undefined不再报错等 支持Concurrent模式&#xff0c;带来新的API&#xff0c;如useTransition、useDeferredValue等 如何升级React 18 npm install reactlatest react-domlatestnpm install ty…

VS2022 在非Qt项目中引用QString、QList等方法

目录 一、新建项目 二、拷贝 三、工程属性设置 四、测试 一、新建项目 在VS中创建了一个c控制台项目&#xff0c;会默认打印“Hello world”&#xff1b; 二、拷贝 需要拷贝的包括QtCore相关的lib, dll, 以及头文件&#xff1b; 1、lib文件 在下述qt安装路径下拷贝Qt5…

[设计模式Java实现附plantuml源码~创建型] 对象的克隆~原型模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

07章【常用类库API】

字符串操作 String类 String可以表示一个字符串。String类实际是使用字符数组存储的。 String类的两种赋值方式&#xff1a; 一种称为直接赋值&#xff1a; String name “小白” 通过关键字new调用String的构造方法赋值 String name new String(“小白”)String类的两…

c++学习理解之路——基类指针指向子类

参考&#xff1a;基类指针指向子类对象_基类指针可以指向子类-CSDN博客 笔记&#xff08;基于自己的理解&#xff0c;欢迎讨论&#xff09; 基类指针对象只存储跟基类中的成员函数、成员对象相关信息&#xff0c;子类指针对象存储了子类和基类中的信息。按道理来说&#xff0c…