泛型编程介绍

一.概念

1.泛型编程(Generic Programming)

在计算机科学中,是一种允许一个值取不同数据类型(所谓多态)的技术。这种编程风格强调使用泛型技术,旨在推出一种针对算法、数据结构和内存分配机制的分类方法,以及其他能够带来高度可重用性、模块化和可用性的软件工具。

泛型这个词并不是通用的,在不同的语言实现中,具有不同的命名。在Java/Kotlin/C#中称为泛型(Generics),在ML/Scala/Haskell中称为Parametric Polymorphism,而在C++中被叫做模板(Template),比如最负盛名的C++中的STL。

2.泛型编程的特点:

代码复用:泛型编程可以编写一次代码,适用于多种数据类型,减少了代码的重复编写。例如,对于容器类型的操作,使用泛型方法可以避免对不同数据类型重复编写相同的代码。

灵活性:泛型编程能够处理不同类型的数据,使得程序更加灵活和可扩展。通过使用泛型算法和模板,可以在程序中处理各种不同类型的数据,而无需为每种数据类型编写特定的代码。

性能优化:泛型编程在编译时生成特定类型的代码,可以在一定程度上提高程序的性能。这种性能优化是因为泛型代码在编译时可以根据具体的数据类型进行优化,从而避免了运行时类型转换的开销。

独立性:泛型算法独立于任何特定的容器类型,这使得它们可以在各种容器上工作,只要这些容器支持所需要的基本操作。这种独立性使得泛型算法更加灵活和可重用。

在泛型编程中,可以使用类型参数来声明泛型类型,如<T>,表示接收任意类型的输入参数。在调用泛型函数或类时,可以使用<>运算符来指定所需的类型参数。

泛型编程在软件开发中广泛应用,能够大大提高代码的灵活性和可扩展性,降低重复代码和错误,提高软件开发的效率和质量。

二.C++中的泛型编程

1.模板是泛型编程的一种重要思想,它允许开发者创建独立于任何特定类型的代码。

C++ STL(Standard Template Library)正是泛型编程的一个模版库。

序列式容器主要有:

list(双向链表)

deque(双端队列)

stack(栈)

queue(队列)

heap(堆)

priority_queue(优先队列)

slist(单向链表)

array(数组)

forward_list(正向链表)

关联式容器主要有:

set(有序集合)

multiset(多重有序集合)

map(映射)

multimap(多重映射)

此外,STL还提供了无序关联容器,也被称为哈希容器,主要包括:

unordered_set(哈希集合)

unordered_multiset(哈希多重集合)

unordered_map(哈希映射)

unordered_multimap(哈希多重映射)

这些容器各有特点,适用于不同的场景。

vector适用于需要动态调整大小且元素访问频繁的情况;

list适用于频繁进行插入和删除操作的情况;

set和map则适用于需要自动排序的场景。

2.函数模板:

函数模板是一种通用的函数定义,允许在函数体中使用参数的类型作为参数。通过函数模板,可以实现对不同类型的数据执行相同的操作,提供代码重用和类型安全。

函数模板的定义使用 template 关键字,后跟模板参数列表和函数原型。例如:

template <typename T>

T Add(T a, T b) {

    return a + b;

}

在上述示例中,typename T 是函数模板的参数列表,表示类型参数。函数体内的 T 表示使用该类型参数进行操作。

函数模板的使用方式是在调用函数时,根据实参的类型自动推导出模板参数的具体类型。例如:

int result1 = Add(1, 2);               // 调用 Add<int>(1, 2);

double result2 = Add(3.14, 2.5);       // 调用 Add<double>(3.14, 2.5);

3.类模板:

 类模板是一种通用的类定义,类的成员变量和成员函数的类型可以在类定义时使用模板参数。通过类模板,可以编写可以使用多种数据类型的通用类。

 类模板的定义使用 template 关键字,在类定义中通过特定的模板参数表示类型参数。例如:

template <typename T>

class MyContainer {

private:

    T* elements;

    int size;

public:

    MyContainer(int n) {

        size = n;

        elements = new T[size];

    }

    // 其他成员函数的定义...

};

在上述示例中,typename T 是类模板的参数列表,表示类型参数。类中的成员变量 T* elements 和 int size 使用了类型参数 T。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WIFI加密方式对无线速率的影响

文章目录 无线加密三种选择&#xff1a;WEP、WPA和WPA2测试平台和测试方法非加密和WEP加密测试 结果差别巨大非加密条件下 300M无线路由实测WEP加密条件下 300M无线路由实测 TKIP加密算法&#xff1a;WPA与WPA2成绩低迷WPA加密&#xff08;TKIP加密算法&#xff09;条件下 300M…

万兆以太网MAC设计(6)IP协议报文格式详解以及IP层模块设计

文章目录 前言&#xff1a;IPv4报文协议格式二、IP_RX模块设计2.1、模块接口2.2、模块工作过程 三、IP_TX模块设计3.1、模块接口3.2、模块工作过程 四、仿真4.1、发送端4.2、接受端 前言&#xff1a;IPv4报文协议格式 参考&#xff1a;https://sunyunqiang.com/blog/ipv4_prot…

CLIP论文笔记:Learning Transferable Visual Models From Natural Language Supervision

导语 会议&#xff1a;ICML 2021链接&#xff1a;https://proceedings.mlr.press/v139/radford21a/radford21a.pdf 当前的计算机视觉系统通常只能识别预先设定的对象类别&#xff0c;这限制了它们的广泛应用。为了突破这一局限&#xff0c;本文探索了一种新的学习方法&#x…

[ESP32]:TFLite Micro推理CIFAR10模型

[ESP32]&#xff1a;TFLite Micro推理CIFAR10模型 模型训练 数据集处理 from keras.datasets import cifar10 from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential, load_model, Model from keras.layers import Input, Dense, …

SSH新功能揭秘:远程工作提升指南【AI写作】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

【快速入门 LVGL】-- 5、Gui Guider界面移植到STM32工程

上篇&#xff0c;我们已学习&#xff1a;【快速入门 LVGL】-- 4、显示中文 工程中添加了两个按钮作示范。运行效果如图&#xff1a; 本篇&#xff1a;把Gui Guider设计好的界面&#xff0c;移植到STM32工程。 特别地&#xff1a; 在使用Gui Guider进行界面设计时&#xff0c;应…

浅谈叉车车载电脑的市场现状

叉车的起源 叉车源于美国&#xff0c;兴于日本&#xff0c;虽然中国起步较晚&#xff0c;但是近些年来发展迅速。叉车又称叉式装载车&#xff0c;是对于成件托盘类货物进行装卸、堆垛和短距离运输&#xff0c;实现重物搬运作业的轮式工业车辆。 叉车的分类 叉车分为以上六大类…

Apache RocketMQ ACL 2.0 全新升级

作者&#xff1a;徒钟 引言 RocketMQ 作为一款流行的分布式消息中间件&#xff0c;被广泛应用于各种大型分布式系统和微服务中&#xff0c;承担着异步通信、系统解耦、削峰填谷和消息通知等重要的角色。随着技术的演进和业务规模的扩大&#xff0c;安全相关的挑战日益突出&am…

报错:测试报错postman(测试接口)

报错如下 c.e.exception.GlobalExceptionHandler : 异常信息&#xff1a; Content type multipart/form-data;boundary--------------------------952399813172082093419475;charsetUTF-8 not supported 解决&#xff1a; 异常信息 Content type multipart/form-data;boundary…

git常见命令(成长版)

ps&#xff1a;所谓成长版就是后续可能还会添加命令&#xff1a; 1.删除本地分支&#xff1a; git branch -d 分支名 2.拉取代码后默认master分支&#xff0c;切换到线上其他分支&#xff1a; &#xff08;1&#xff09;查看线上所有分支&#xff1a; git branch -a &#…

【网络安全】HTTP协议 — 特点

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 学习目标​ 一、请求与响应 1.服务器和客户端 二、不保存状态 1.不保存状态的协议 三、资源定位 1.URI&#xff08;统一资源标识符&#xff09; 四、请求方法 1.请求方法 五…

代码随想录算法训练营Day10 | 232.用栈实现队列、225. 用队列实现栈

232.用栈实现队列 题目&#xff1a;请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除…

Git的操作和使用

一、基本操作 1、创建git本地仓库 &#xff08;1&#xff09;创建目录&#xff1a;mkdir gitcode &#xff08;2&#xff09;进入目录&#xff1a;cd gitcode/ &#xff08;3&#xff09;查询目录内容&#xff1a;ls &#xff08;4&#xff09;在当前目录下创建git本地仓库…

数据结构(七)---二叉树

目录 一.树的基本概念 二.树的性质 三.二叉树 1.二叉树的基本概念 2.特殊的二叉树 &#xff08;1&#xff09;满二叉树 &#xff08;2&#xff09;完全二叉树 &#xff08;3&#xff09;二叉排序树 &#xff08;4&#xff09;平衡二叉树 3.二叉树的性质 4.完全二叉树…

CC软件防火墙和WEB应用防火墙哪个好

本文将从CC软件防火墙的定义、原理、功能以及应用方面进行全面探讨&#xff0c;旨在加深对CC软件防火墙的理解&#xff0c;并推动网络安全意识的普及。以及WEB应用防火墙二者之间的对比。让用户更了解两个形态产品并作出选择。 第一部分&#xff1a;CC软件防火墙的定义和原理 …

北京小米智能工厂

小米工厂智能化 小米集团昌平区的小米智能工厂二期&#xff0c;成为引领智能化制造的重要一环。这座工厂计划打造成为京津冀地区智能制造示范工厂和全球级的“灯塔工厂”。 工厂位于小米未来产业园区&#xff0c;占地81000平方米&#xff0c;年产能可达千万台智能手机&#xff…

创新指南 | 2024年企业如何十步打造最佳的数字化营销策略组合

营销是一个动态且不断变化的领域。顶级的数字营销策略随着消费者和技术趋势的变化而变化。这就是为什么每个公司都需要一个经过良好规划并具有明确里程碑和目标的营销策略。一旦你有了正确的计划&#xff0c;你实现为业务设定的目标的可能性就会大大增加。这意味着&#xff0c;…

提交链码-编辑前后端,调用链码功能

一 . 链码介绍 1.什么链码&#xff1f; • 链码是一段用 Go、Node.js 或者 Java 实现了规定接口的程序。链码在安全的Docker容器中运行&#xff0c; 与背书节点的进程隔离。通过应用程序提交的交易&#xff0c;链码初始化和管理账本状态。• 链码通常处理网络成员协商达成的业…

全网都在找的python+requests接口自动化测试框架实例详解教程

前言 Python是一种功能强大的编程语言&#xff0c;它可以用于自动化测试&#xff0c;特别是接口自动化测试。许多Python库都可以用于接口自动化测试&#xff0c;其中requests库是其中最受欢迎的库之一。 requests库可以用于发送HTTP请求并获取服务器响应&#xff0c;从而轻松…

spring常用注解(五)lombok库

一、介绍&#xff1a; 1、简介&#xff1a; Lombok是一个作用于编辑器和构建工具的 Java 库&#xff0c;可以对编写的 Java 代码进行增强&#xff0c;比如说不用再写实体类的 getter 方法&#xff0c;equals 方法而是自动生成&#xff0c;自动生成日志输出变量等等&#xff0…